Как mock angular переводить фильтр в модульные тесты для директив
В моих шаблонах директив мне нужно использовать фильтр перевода angular как таковой:
<label for="data-source-btn">
<span id="data-source-btn-span"></span>
{{'Data Source' | translate}}
</label>
Затем в моей unit test для этой директивы я получаю сообщение об ошибке:
Неизвестный поставщик: translateFilterProvider < - translateFilter
Я попытался ввести $filter
и получить $translate
на $translate = $filter('translate');
, который не решает проблему - это действительно для тестирования фильтра
Я могу ввести модуль pascalprecht.translate
, но это тяжело. Как лучше всего подстроить фильтр?
Ответы
Ответ 1
Ниже приведен простой пример того, как вы можете издеваться над фильтром.
var mockTranslateFilter;
beforeEach(function() {
module(function($provide) {
$provide.value('translateFilter', mockTranslateFilter);
});
mockTranslateFilter = function(value) {
return value;
};
});
Ответ 2
Это работает для меня. Но, конечно, вы должны установить значение mockTraslateFilter для работы, прежде чем использовать его в другом funciton.
var mockTranslateFilter;
beforeEach(function() {
mockTranslateFilter = function(value) {
return value;
};
module(function($provide) {
$provide.value('translateFilter', mockTranslateFilter);
});
});
еще короче, если вы используете ES6:
beforeEach(angular.mock.module(progressBarComponent, ($provide) => {
$provide.value('translateFilter', (v) => v);
}));
Ответ 3
Это путь ES6:
beforeEach(angular.mock.module('myModule'), ($provide) => {
$provide.value('$translate', t => ({ then: cb => cb(t) }));
}));
Это не издевается над методом $translate.instant. Для этого вы можете назначить функцию переменной и затем присвоить свойству angular.identity свойству instant
.