簡體   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