Подтвердить что ты не робот

Как 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, но это тяжело. Как лучше всего подстроить фильтр?

4b9b3361

Ответ 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.