Ожидание: при тестировании template
или выводимых directive
/ component
переводы, такие как <h1>{{home.title | translate}}</h1>
, должны быть переведены, чтобы отображался фактический текст <h1>Home Page</h1>
.
Теперь, после долгих поисков, я смог заставить его работать, вручную помещая нужные мне переводы в свой тест.
Пример. Текущий тест использует ручную настройку перевода в тесте. Здесь ключ $translateProvider.translations
.
(function() {
'use strict';
describe('home component', function() {
var rootscope, compile, directiveElement;
beforeEach(module('Templates'));
beforeEach(module('myApp'));
beforeEach(module('tmh.dynamicLocale'), function () {
tmhDynamicLocaleProvider.localeLocationPattern('base/angular/i18n/angular-locale_{{locale}}.js');
});
beforeEach(module('pascalprecht.translate', function ($translateProvider) {
$translateProvider.translations('en', {
"home":{
"title": "Home page"
}
});
}));
beforeEach(inject(function(_$rootScope_, _$compile_) {
rootscope = _$rootScope_.$new();
compile = _$compile_;
}));
function getCompiledElement(){
var element = angular.element('<home-component></home-component');
var compiledElement = compile(element)(rootscope);
rootscope.$digest();
return compiledElement;
}
describe('home', function () {
it('should have template defined', function () {
directiveElement = getCompiledElement();
console.log('my component compiled', directiveElement);
});
});
});
})();
Output generated is correct:
Домашняя страница
Теперь это выше компилирует мой компонент и показывает правильно переведенный текст вместо того, чтобы видеть фигурные скобки и ключи. Теперь в реалистичном приложении не очень удобно вручную брать нужные вам переводы и вставлять их, так как переводы могут измениться, и вы можете забыть обновить свой тест.
Я хотел бы, чтобы в моих тестах использовались фактические статические файлы перевода json
resources
| locale-en_US.json
Я попытался использовать приведенный ниже код, однако, поскольку он асинхронный, он не загружается к тому времени, когда проходят тесты. Мне нужен способ либо дождаться загрузки файлов, либо другой способ загрузить файлы в папку $translateProvider
.
$translateProvider.useStaticFilesLoader({
prefix: 'app/resources/locale-', // path to translations files
suffix: '.json'
});
Я также попытался загрузить языковые файлы json через karma.conf.js
, как показано ниже.
Files[
...
{ pattern: 'app/resources/angular-i18n/*.js', included: true, served: true },
{pattern: 'app/resources/*.json', included: true, served: true},
]
Я знаю, что должен быть способ, которым это может работать, но я еще не нашел решения. Некоторые говорят, что их решение работает, однако я пробовал использовать разные плагины и, похоже, все еще не работает.
ОБНОВЛЕНИЕ: Пользовательский загрузчик
Я читаю о создании собственного загрузчика для $translateProvider
. Я не уверен, как построить его, чтобы он работал так, как я хочу, чтобы его можно было правильно использовать для тестирования, но если другие изучают это, то это может быть местом для просмотра.
$provide.factory('customLoader', function ($q) {
return function () {
var deferred = $q.defer();
deferred.resolve({});
return deferred.promise;
};
});
$translateProvider.useLoader('customLoader');
translate
и создавать выходные значения из файлов JSON, аналогично тому, как это делает сторонний переводчик, в то время как настоящий pascalprecht.translate никогда не включается. - person Estus Flask   schedule 14.02.2018