2015-01-05 4 views
2

Следующая служба использует $q.when обернуть третьей стороной обещание:Почему инъекция «ng» в модульных тестах изменяет обещание обработки?

// 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 никогда не решает и жасмин раз из. Тем не менее, если я вручную вводить 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. ли это хороший образец, чтобы использовать
+0

Сначала я думаю, что вы должны изолировать инициализацию pouchdb внутри фабрики и создать фабрику для инициализации новых экземпляров pouchdb. Таким образом, вы можете позже изолировать вызов информации pouchdb и убедиться, что его правильно издевательство и обещание разрешено. –

+0

Потому что вы используете pouchDB ('db') в своих тестах, и я не вижу, что это возможно. –

ответ

0

ли вы используете угловые макеты? https://docs.angularjs.org/api/ngMock

Единственная причина, почему я думаю, что вам нужно, чтобы ввести «нг» вручную, если нет нг-приложение инициализирует приложение, по крайней мере, по https://docs.angularjs.org/api/ng/function/angular.module

При использовании угловых высмеивает его позаботится об этом https://github.com/angular/angular.js/blob/master/src/ngMock/angular-mocks.js#L1785

Не могу придумать другую причину, почему эта проблема возникнет.

+0

Да, угловые издевки получены: https://gist.github.com/tlvince/49465f30fc414a668466 – tlvince

Смежные вопросы