Следующая служба использует $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);
});
});
Может кто-нибудь объяснить, почему;
- Первая спецификация не решает
- Вторая спецификация делает (инъекционные
ng
) - Он не нуждается в
$rootScope.$apply
- ли это хороший образец, чтобы использовать
Сначала я думаю, что вы должны изолировать инициализацию pouchdb внутри фабрики и создать фабрику для инициализации новых экземпляров pouchdb. Таким образом, вы можете позже изолировать вызов информации pouchdb и убедиться, что его правильно издевательство и обещание разрешено. –
Потому что вы используете pouchDB ('db') в своих тестах, и я не вижу, что это возможно. –