我有以下控制器 ViewMeetingCtrl.js
(function () { 'use strict'; angular.module('MyApp').controller('ViewMeetingCtrl', ViewMeetingCtrl); ViewMeetingCtrl.$inject = ['$scope', '$state', '$http', '$translate', 'notificationService', 'meetingService', '$modal', 'meeting', 'attachmentService']; function ViewMeetingCtrl($scope, $state, $http, $translate, notificationService, meetingService, $modal, meeting, attachmentService) { $scope.meeting = meeting; $scope.cancelMeeting = cancelMeeting; function cancelMeeting(meetingId, companyId) { meetingService.sendCancelNotices(companyId, meetingId) .success(function () { $state.go('company.view'); }); } } })();
我能够成功地为 cancelMeeting() 调用spyOn,但不能通过 sendCancelNotices 方法的调用来 实现 。我想要做的是,我想测试,只要 cancelMeeting() 被调用,它调用 sendCancelNotices() 方法。我知道我应该使用createSpy方法来执行此操作。但是我不确定该怎么做。
下面是测试用例ViewMeetingCtrlSpec.js
describe('ViewMeetingCtrl CreateSpy --> Spying --> cancelMeeting', function () { var $rootScope, scope, $controller , $q ; var sendCancelNoticesSpy = jasmine.createSpy('sendCancelNoticesSpy'); beforeEach(angular.mock.module('MyApp')); beforeEach(inject(function ($rootScope, $controller ) { scope = $rootScope.$new(); createController = function() { return $controller('ViewMeetingCtrl', { $scope: scope, meeting : {} }); }; var controller = new createController(); })); it("tracks that the cancelMeeting spy was called", function() { //some assertion }); });
describe('ViewMeetingCtrl', function () { var scope, meetingService; beforeEach(angular.mock.module('MyApp')); beforeEach(inject(function ($rootScope, $controller, _meetingService_) { scope = $rootScope.$new(); meetingService = _meetingService_; $controller('ViewMeetingCtrl', { $scope: scope, meeting : {} }); })); it('should send cancel notices whan cancelMeeting is called', function() { var fakeHttpPromise = { success: function() {} }; spyOn(meetingService, 'sendCancelNotices').andReturn(fakeHttpPromise); scope.cancelMeeting('foo', 'bar'); expect(meetingService.sendCancelNotices).toHaveBeenCalledWith('bar', 'foo'); }); });
我鼓励您停止依赖HTTP从服务返回的Promise。相反,只要考虑服务会返回承诺即可。这些更容易模拟,并且当您不再返回HTTP Promise时,也不会强迫您重写控制器代码。
在您的控制器中:
function cancelMeeting(meetingId, companyId) { meetingService.sendCancelNotices(companyId, meetingId) .then(function () { $state.go('company.view'); }); }
在您的测试中:
var fakePromise = $q.when(); spyOn(meetingService, 'sendCancelNotices')and.returnValue(fakePromise); scope.cancelMeeting('foo', 'bar'); expect(meetingService.sendCancelNotices).toHaveBeenCalledWith('bar', 'foo');