我有以下测试执行以下操作:
第2步的断言失败,因为货币代码为空。似乎我不能在我的测试中对这些承诺进行排序。代码如下:
beforeEach(inject(function($rootScope, $controller, $log, $q) {
//.....
spyOn(clientMoneyService, findCurrencyCodes').andReturn(deferral.promise);
}));
it('should clear currency codes on error', inject(function() {
scope.findCurrencyCodes();
// first call returns currencies
deferral.resolve(response);
var response = {
data: ['AUD', 'CAD']
};
scope.$apply();
expect(scope.currencyCodes).toEqual(['AUD', 'CAD']);
// second call errors out
deferral.reject();
scope.findCurrencyCodes();
scope.$apply();
expect(scope.currencyCodes).toBeNull();
}));
有没有办法对我的承诺进行排序,以便在第一次通话时获得货币代码列表,第二次通话我收到错误?
答案 0 :(得分:1)
任何给定的承诺只能用于返回一个结果(无论是解决还是拒绝),因此在解决它之后尝试拒绝承诺将不起作用。测试方法的最简单方法是将测试分成两个,每个结果一个:
it('should resolve to currency codes on success', function() {
scope.findCurrencyCodes();
deferral.resolve({data: ['AUD', 'CAD']});
scope.$digest();
expect(scope.currencyCodes).toEqual(['AUD', 'CAD']);
});
it('should clear currency codes on error', function() {
scope.currencyCodes = ['AUD', 'CAD'];
scope.findCurrencyCodes();
deferral.reject();
scope.$digest();
expect(scope.currencyCodes).toBeNull();
});
如果由于某种原因你真的必须在同一个测试中断言两者,那么你需要修改你的存根findCurrencyCodes
以在每次调用时返回一个新的承诺。