繁体   English   中英

为什么在单元测试中注入“ ng”会改变承诺处理行为?

[英]Why does injecting 'ng' in unit tests change promise handling behaviour?

以下服务在包装第三方诺言时使用$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. 是否使用好模式

您是否正在使用角-? https://docs.angularjs.org/api/ngMock

我认为您需要手动注入ng的唯一原因是,如果没有ng-app初始化您的应用程序,至少根据https://docs.angularjs.org/api/ng/function/angular 。模块

如果您使用angular-mocks,它会为您解决这一问题https://github.com/angular/angular.js/blob/master/src/ngMock/angular-mocks.js#L1785

想不到为什么会出现此问题的任何其他原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM