我正在尝试使用Jasmine间谍来测试在$资源上调用查询的控制器。当我按照以下方式编写对资源的调用时,我可以获得成功的测试(下面链接的插件中的实现1)
function($scope, bagelApiService) {
bagelApiService
.query()
.$promise
.then(function(bagelsResponse) {
$scope.bagels = bagelsResponse;
$scope.somethingAfterBagelsLoad = true;
});
}
但我宁愿像这样调用资源(下面链接的plunk中的实现2)
function($scope, bagelApiService) {
bagelApiService.query(function(bagelsResponse) {
$scope.bagels = bagelsResponse;
$scope.somethingAfterBagelsLoad = true;
});
}
这是我的规范
describe('BreakfastCtrl', function() {
var $q,
$rootScope,
_scope,
mockBagelsResponse = [{name: 'foobagel'}, {name: 'barbagel'}];
beforeEach(module('BreakfastApp'));
beforeEach(inject(function($controller, $q, $rootScope, bagelApiService) {
_scope = $rootScope.$new();
var queryDeferred = $q.defer();
spyOn(bagelApiService, 'query').andReturn({$promise: queryDeferred.promise});
$controller('BreakfastCtrl', {
'$scope': _scope,
'bagelApiService': bagelApiService
});
queryDeferred.resolve(mockBagelsResponse);
$rootScope.$apply();
}));
it('should set scope.bagels', function() {
expect(_scope.bagels).toEqual(mockBagelsResponse);
});
});
任何想法为什么实现2未通过测试(即使它运行正常),以及如何编写测试以通过实现2?
答案 0 :(得分:2)
这是因为你没有完全模仿query()
。
它应该是这样的(至少使你的两个实现都有效)。
spyOn(bagelApiService, 'query').andCallFake(function (callback) {
queryDeferred.promise.then(callback);
return { $promise: queryDeferred.promise };
});
示例Plunker: http://plnkr.co/edit/wGAytf5ASSJwut4WUwGO?p=preview