单元测试依赖于服务的角度过滤器
问题描述:
我正在尝试测试我构建的自定义过滤器。我遇到的问题是这个过滤器依赖于通过服务的异步调用。下面是我的相关过滤代码在前,我目前的测试:单元测试依赖于服务的角度过滤器
.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调用移动到控制器,然后将所需的数据传递给过滤器。