karma jasmine servce promise在单元测试和$ stateChangeStart中无法解析

时间:2015-11-21 20:01:52

标签: angularjs jasmine promise karma-runner

我需要创建以下单元测试,它依赖于正在解析的服务中的promise,但是从不调用finally()回调。该承诺在实际应用中运行良好。我已经在各个地方读过我需要开始一个摘要周期,但这不起作用。我正在使用ui-router,它只是启动$ stateChangeStart请求并尝试检索第一个状态的模板。 (因此$ httpBackend模拟了它。)

  var $rootScope;
  var scope;
  var $httpBackend;
  var FormulaValidator;
  var mockFunctionApiBaseUrl = 'http://localhost:5555';

  beforeEach(function() {
    module('ps', function($provide) {
        $provide.constant('functionApiBaseUrl', mockFunctionApiBaseUrl);
        $provide.value('identity', {
          getUsernameFromLocalStorage: function() {
            console.log('getting mock username from local storage');
            return 'BLAH';
          },
          verifyToken: function(token) {
            return true;
          }
        });
  });
  beforeEach(function(done) {
    inject(function(_$httpBackend_, _$rootScope_, _FormulaValidator_) {
      $httpBackend = _$httpBackend_;
      $rootScope = _$rootScope_;
      scope = $rootScope.$new();
      FormulaValidator = _FormulaValidator_;
      $httpBackend.expect('GET', mockFunctionApiBaseUrl + '/api/list/functions').respond(200, '{"MA": {}}');
      $httpBackend.expect('GET', '/0.1.1/json/assets.json').respond(200, '["AAPL US EQUITY"]');
      $httpBackend.expect('GET', '/null/templates/dashboard.html').respond(200, '<html></html>');
      done();
    })
  });

  afterEach(function() {
   $httpBackend.flush();
  });

  it('Basic Validation 1', function (done) {
    FormulaValidator.promise.finally(function () {
      console.log('FormulaValidator.spec.promise finally');
      var p = FormulaValidator.validateFormula('MA(AAPL US EQUITY, 30)');
      console.log('getFunctions:  ' + FormulaValidator.getFunctions().length);
      expect(p).toBe(true);
      done();
    });
    scope.$apply();
    //$rootScope.$digest();
  });

1 个答案:

答案 0 :(得分:1)

只有在您清空$httpBackend时才能解析$ http承诺。

afterEach()中刷新它是为时已晚:刷新$httpBackend的目的是告诉它:好的,现在你应该收到请求,发送回来以便我已经告诉你在致电$httpBackend.expect()时发回的信息已经解决了承诺。

详细了解the doc