Единичное тестирование услуг AngularJS и PouchDB

70
7

Я пытаюсь объединить тесты с отдельными Угловыми фабриками, но мне тяжело пытаться правильно издеваться и вводить объект PouchDB. В настоящее время мой заводской код выглядит следующим образом:

factory('Track', [function() {
var db = new PouchDB('tracks');
var resource = {
getAll: function() {
return db.allDocs({include_docs: true});
}
return resource;
}]);

Я попытался использовать услугу "Угловая", чтобы придать макету экземпляр PouchDB без везения:

 module(function($provide) {
$provide.value('PouchDB', {
allDocs: function() {
return 'MOCKED';
}
});

Я не совсем уверен, куда идти отсюда. Любая помощь будет принята с благодарностью!

спросил(а) 2014-03-23T17:12:00+04:00 6 лет, 7 месяцев назад
1
Решение
82

Как указано в комментариях: вы должны обернуть глобальную переменную PouchDB внутри службы, чтобы сделать ее инъекционной. Это связано с тем, что Angular выполняет DI через простые функциональные параметры. Так что просто сделайте что-нибудь вроде:

  angular.module('myModule')
.factory('PouchDBWrapper', function(){
return PouchDB;
}

Затем вы можете ввести его в свою фабрику Track:

 factory('Track', [function(PouchDBWrapper) {
var db = new PouchDBWrapper('tracks');
var resource = {
getAll: function() {
return db.allDocs({include_docs: true});
}
return resource;
}]);

и в вашем тесте вы можете издеваться над ним:

module(function($provide) {
$provide.factory('PouchDBWrapper', {
allDocs: function() {
return 'MOCKED';
}
});

ответил(а) 2014-03-23T21:44:00+04:00 6 лет, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема