angularjs - 如何使用 done() 和 catch() 回调模拟在 angularjs 中返回承诺的服务
问题描述
我想在 angularjs 中模拟一个用于单元测试的服务,它看起来像这样:
TranslationService.translate(args)
.then(function translated(value) {
//somecode
return;
})
.catch()
.done();
按照这个答案: 如何模拟在 Angularjs Jasmine 单元测试中返回承诺的服务?
这就是我模拟它的方法:
TranslateServiceMock = {
translate: jasmine.createSpy('translate').and.callFake(function() {
var deferred = $q.defer();
deferred.resolve('Remote call result');
return deferred.promise;
})};
但似乎这仍然行不通,我猜是因为链接的“完成”和“捕获”方法,
这是我得到的错误:
TypeError: undefined is not a constructor (near '....done();...'
没有想法为什么会发生这种情况或如何解决这个问题..
解决方案
正如评论中提到的, done 不是 promise 对象的一部分。
我通过存根完成的回调来完成这项工作:
beforeEach( function () {
module(myModule.name, function ($provide) {
// define a .done on the $q Promise
$provide.decorator('$q', function ($delegate) {
var Promise = $delegate.when().constructor;
Promise.prototype.done = angular.noop;
return $delegate;
});
$provide.factory('TranslationService', function ($q) {
var svc = jasmine.createSpyObj('TranslationService', ['translate']);
svc.translate.and.returnValue($q.when(''));
return svc;
});
});
});