我有以下控制器 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');
问题内容: 我有内部类的课程,如下所示: 模仿测试如下所示:build.gradle: 测试: 第一次测试正在按预期方式工作。第二个永远不会被检测为“已调用”,尽管在日志中我看到的是。有什么问题吗?:) 谢谢! 问题答案: 怎么了? 好吧,这里的问题非常微妙,当您调用时,会在实例背后创建某种装饰器,以允许监视实例上的所有方法调用。因此,您可以检查给定方法被调用了多少次, 但是在装饰器 上 却 没有
我正在为类编写一个单元测试,该类如下所示: 我想编写一个简单的单元测试,它将方法存根(这样它就不会实际触发并命中数据库),但它允许我验证调用是否最终执行。Mockito似乎是这份工作的合适工具。 这似乎是一个很好的游戏计划(至少对我来说)。但当我实际编写代码时,在测试方法的第2行(行)出现以下编译器错误: 类型Mockito中的(T)不适用于参数(void)时的方法 我看到Mockito无法模拟返
引用同一类中的模拟方法 测试类 当调用真正的类temp到methodA时,应该返回模拟的方法B的值。从而返回true。为什么这不正确。我遇到了同样的问题。我想在真实的类上运行测试,而不是像答案中建议的那样在模拟对象上运行测试。我想运行类methodA,并在调用它时期待模拟对象spyTemp methodB的值
我使用文件在 Webstorm 8.0.4 中设置了茉莉花集成 这与语法突出显示的工作方式一样,我可以跳转到声明,文档显示正确。所以连接看起来很好。然而,JSHint仍然为每个关键字抱怨它没有被定义,例如 另请参见以下屏幕截图。正如您所看到的,语法突出显示很好,但我仍然收到一个错误。
当我试图在单元测试中窥探一个对象时,我得到了一个异常。这是我的单元测试文件: 我在assign bookInfoParams Spy链接处遇到异常:
我很难找到sinon间谍没有被触发的原因。在下面的测试中,两个控制台语句都报告为false,因此两个方法都没有被调用(以防出现错误)。 这是我的一个摩卡测试通常的样子: }); PostOnToller中的方法: 最后是PostModel中的方法: 如果我以正常的方式调用方法,它们会执行查找,返回预期的Posts数组。但是,不会执行间谍。另外,如果我将控制器类中的方法更改为 间谍函数(res)确实