以下是我在角度1.5.x中测试被拒绝的承诺的方法。更新到1.6.1引入了“可能未处理的拒绝”错误。我理解这个错误的目的,但我还没有想出一个简单的方法。 Jasmine(2.5.x)和.throwError()方法似乎导致测试因错误而失败。
describe('TestTarget', () => {
let $q, $rootScope, TestTarget, SomeModel;
beforeEach(() => {
SomeModel = jasmine.createSpyObj('SomeModel', ['get']);
module('something');
module($provide => {
$provide.value('SomeModel', SomeModel);
});
inject((_$q_, _$rootScope_, _TestTarget_) => {
$q = _$q_;
$rootScope = _$rootScope_;
TestTarget = _TestTarget_;
});
});
describe('get()', () => {
it('on error, adds a danger message', () => {
SomeModel.get.and.returnValue($q.reject());
// SomeModel.get.and.throwError(); // doesn't work either
TestTarget.get();
$rootScope.$digest();
expect(SomeModel.get).toHaveBeenCalled();
expect(<< the rejection outcome of TestTarget.get().then() >>);
});
});
});
我希望继续在我的模型,服务和控制器中传递被拒绝的承诺。
答案 0 :(得分:2)
让我们说你的实际代码是这样的:
angular.module('myApp').service('TestTarget', ['SomeModel', function(SomeModel) {
this.get = function() {
return SomeModel.get();
}
}]);
我的假设是你没有.catch
块链接到返回的Promise。
在这种情况下,您可以像这样测试它:
it('on error, adds a danger message', () => {
SomeModel.get.and.returnValue($q.reject('some error'));
TestTarget.get()
.then(function() {
fail('the promise should not have been resolved');
}).catch(function(err) {
expect(err).toBe('some error');
});
$rootScope.$digest();
expect(SomeModel.get).toHaveBeenCalled();
});
请注意,我在函数调用中添加了一个catch块。 $rootScope.$digest()
确保承诺得到解决,并且所有已锁定的then
和catch
块都会被调用。
答案 1 :(得分:0)
我有角度1.6.1这个问题。在测试中尝试使用callFake而不是returnValue。
describe('TestTarget', () => {
let $q, $rootScope, TestTarget, SomeModel;
beforeEach(() => {
SomeModel = jasmine.createSpyObj('SomeModel', ['get']);
module('something');
module($provide => {
$provide.value('SomeModel', SomeModel);
});
inject((_$q_, _$rootScope_, _TestTarget_) => {
$q = _$q_;
$rootScope = _$rootScope_;
TestTarget = _TestTarget_;
});
});
describe('get()', () => {
it('on error, adds a danger message', () => {
SomeModel.get.and.callFake(() => $q.reject());
// SomeModel.get.and.throwError(); // doesn't work either
TestTarget.get();
$rootScope.$digest();
expect(SomeModel.get).toHaveBeenCalled();
expect(<< the rejection outcome of TestTarget.get().then() >>);
});
});
});