[英]Angular Karma/Jasmine testing: How to mock a service in controller with promises?
我正在尝试对控制器进行单元测试。 我要进行单元测试的功能是:
function myFunction() {
MyService
.myMethod(thing1, thing2)
.then(function handleMyMethod(result) {
SomeModule.errorHandler(result)
.onSuccess(function onSuccess() {
// do stuff
})
.onError(function onError() {
// do stuff
});
});
}
相关测试文件片段:
var MockService = {
myMethod: function(thing1, thing2) {
var promise = $q.defer().promise;
return promise;
}
};
beforeEach(module(function($provide) {
$provide.value('MyService', MockService);
}));
beforeEach(inject(function (_$controller_, _MyService_, _SomeModule_, ...) {
...
MyService = _MyService_;
MyController = _$controller_('MyController as Ctrl', {
$controller: controller,
MyService: MockService,
});
我对如何编写允许我同时遇到onSuccess和onError情况的测试感到困惑。 我试图覆盖两个分支以涵盖分支,但是不知道语法如何工作。
您可以通过以下两种方式之一进行操作:
myMethod:function(thing1, thing2) { if (thing1=='all good') return $q.when('excellent'); return $q.reject('sorry, bud'); }
it('is a success', function() { spyOn(MockService, 'myMethod').and.returnValue($q.when('excellent'); $rootScope.$apply( MyController.doStuff('foo'); ); expect(MyController.someProperty).toEqual('excellent'); }); //etc.
请注意,您既不需要使用提供代码覆盖模块注入器,也不需要在$ controller locals参数中提供模拟服务。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.