[英]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调用移至控制器,然后将所需的数据传递给过滤器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.