茉莉花测试连续承诺电话

时间:2015-01-20 15:17:40

标签: angularjs unit-testing jasmine karma-runner

我有以下测试执行以下操作:

  1. 进行模拟服务调用,返回一个解析为某些货币代码的承诺。
  2. 断言控制器范围内设置的货币代码与模拟服务返回的货币代码相匹配。
  3. 进行第二次模拟服务调用,导致错误。
  4. 断言控制器范围内设置的货币代码为空。
  5. 第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();
    }));
    

    有没有办法对我的承诺进行排序,以便在第一次通话时获得货币代码列表,第二次通话我收到错误?

1 个答案:

答案 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以在每次调用时返回一个新的承诺。