单元测试依赖于服务的角度过滤器
Unit testing Angular filter which relies on service
我正在尝试测试我构建的自定义过滤器。我遇到的问题是此过滤器依赖于通过服务的异步调用。下面是我的相关过滤器代码,然后是我当前的测试:
.filter('formatValue', ['serverService', '_', function(serverService, _) {
var available = null;
var serviceInvoked = false;
function formatValue(value, code) {
var details = _.findWhere(available, {code: code});
if (details) {
return details.unitSymbol + parts.join('.');
} else {
return value;
}
}
getAvailable.$stateful = true;
function getAvailable(value, code) {
if (available === null) {
if (!serviceInvoked) {
serviceInvoked = true;
serverService.getAvailable().$promise.then(function(data) {
available = data;
});
}
} else {
return formatValue(value, code);
}
}
return getAvailable;
}])
测试:
describe('filters', function() {
beforeEach(function() {
module('underscore');
module('gameApp.filters');
});
beforeEach(module(function($provide) {
$provide.factory('serverService', function() {
var getAvailable = function() {
return {
// mock object here
};
};
return {
getAvailable: getAvailable
};
});
}));
describe('formatValue', function() {
it('should format values', inject(function(formatValueFilter) {
expect(formatValueFilter(1000, 'ABC')).toEqual('å1000');
}));
});
});
我在运行测试时遇到的错误是:
TypeError: 'undefined' is not an object (evaluating 'serverService.getAvailable().$promise.then')
您的模拟服务需要返回已解决的承诺。您可以通过注入$q并返回$q.when(data)
来执行此操作
但是,我会考虑先重构此过滤器。筛选器旨在快速计算,可能不应依赖于异步调用。我建议将 http 调用移动到控制器,然后将所需的数据传递给过滤器。
相关文章:
- 依赖于缓慢加载javascript的UI
- 如何隐藏&使用jQuery禁用依赖于另一个字段值的字段
- Node.js中依赖于版本的类型继承
- 如何使AngularJS控制器依赖于通过ajax加载在rootScope上的值
- 如何使用EnquireJS使AngularJS范围变量依赖于媒体查询
- Ajax xml源解析依赖于jQuery的点击操作
- Sails.js日志传输依赖于环境
- 如何使用 2 个 XMLHttpRequest 一个依赖于另一个
- Javascript表单.使一个条目依赖于另一个条目
- 在<p>标签依赖于<选择>标签,javascript
- Angularjs-uib日期选择器中的customClass依赖于promise
- 试图使一个事件依赖于另一个事件,并使用jquery自定义事件传递数据
- 使用jquery如何自动删除下拉列表中的第一个空白选项(如果它依赖于另一个选项)
- yii2:依赖于Action的条件显示/显示字段
- 测试依赖于另一个指令Angularjs的指令
- 创建一个不依赖于Snap实例的组
- 屏幕依赖于菜单切换,并在javascript中自动打开
- Colspan修改依赖于CSS3@media查询
- 使计算属性依赖于emberjs中另一个对象的所有属性
- 单元测试依赖于服务的角度过滤器