我正在使用Jasmine测试框架的AngularJS v1.2.0-rc.3。
我试图断言控制器调用了服务方法。服务方法返回一个承诺。控制器如下所示:
angular.module('test', []) .controller('ctrl', ['$scope', 'svc', function ($scope, svc) { $scope.data = []; svc.query() .then(function (data) { $scope.data = data; }); }]);
我想测试解析服务方法的延迟后是否将数据分配给了作用域。我已经为服务创建了一个模拟,单元测试如下所示:
describe('ctrl', function () { var ctrl, scope, svc, def, data = [{name: 'test'}]; beforeEach(module('test')); beforeEach(inject(function($controller, $rootScope, $q) { svc = { query: function () { def = $q.defer(); return def.promise; } }; scope = $rootScope.$new(); controller = $controller('ctrl', { $scope: scope, svc: svc }); })); it('should assign data to scope', function () { spyOn(svc, 'query').andCallThrough(); deferred.resolve(data); scope.$digest(); expect(svc.query).toHaveBeenCalled(); expect(scope.data).toBe(data); }); });
我希望可以调用svc的查询方法,但显然没有。
我按照本指南进行了单元测试中的模拟承诺。
我究竟做错了什么?
看来我把间谍放错了地方。当我将其放置在beforeEach中时,测试通过。
beforeEach(inject(function($controller, $rootScope, $q) { svc = { query: function () { def = $q.defer(); return def.promise; } }; spyOn(svc, 'query').andCallThrough(); scope = $rootScope.$new(); controller = $controller('ctrl', { $scope: scope, svc: svc }); }));