为什么注射' ng'在单元测试中改变承诺处理行为?

时间:2015-01-05 12:46:03

标签: javascript angularjs unit-testing

以下服务使用$q.when来包装第三方承诺:

// service.js
angular.module('test', [])
  .service('pouchdb', function($q, $window) {
    var db = new $window.PouchDB('test');
    this.info = function() {
      return $q.when(db.info.apply(db, arguments));
    };
  });

相应的单元测试:

describe('Failing Q when tests', function() {
  beforeEach(module('test'));

  var $rootScope, pouchdb;
  beforeEach(inject(function(_$rootScope_, pouchdb) {
    $rootScope = _$rootScope_;
    pouchdb = pouchdb;
  }));

  it('should resolve a promise', function(done) {
    // FIXME: never resolves
    pouchdb.info()
      .then(function(info) {
        expect(info).toBeDefined();
      })
      .finally(done);
    $rootScope.$apply();
  });
});

pouchdb.info永远无法解决,Jasmine超时。但是,如果我手动注入ng,则规范按预期工作:

describe('Working Q when tests', function() {
  var pouchdb;
  beforeEach(function() {
    var $injector = angular.injector(['ng', 'test']);
    var pouchDB = $injector.get('pouchdb');
    pouchdb = pouchDB('db');
  });

  it('should resolve a promise', function(done) {
    pouchdb.info()
      .then(function(info) {
        expect(info).toBeDefined();
      })
      .finally(done);
  });
});

任何人都可以解释原因;

  1. 第一个规范无法解决
  2. 第二个规范(注入ng
  3. 不需要$rootScope.$apply
  4. 这是否是一个好用的模式

1 个答案:

答案 0 :(得分:0)

你正在使用棱角分明吗? https://docs.angularjs.org/api/ngMock

我认为你需要注射的唯一原因是'如果没有ng-app初始化您的应用,请手动操作,至少根据https://docs.angularjs.org/api/ng/function/angular.module

如果您使用角度模拟,它会为您https://github.com/angular/angular.js/blob/master/src/ngMock/angular-mocks.js#L1785

解决这个问题

不能想出为什么会出现这个问题的任何其他原因。