Angular тестирование с использованием passThrough в модульном тестировании
Я пытаюсь проверить директиву в Angular, но я не могу заставить соответствующий шаблон работать.
Директива перечисляет templateUrl так:
templateUrl: 'directives/listview/view.html'
Теперь, когда я пишу какой-либо unit тест, я получаю
Error: Unexpected request: GET directives/listview/view.html
Итак, я должен использовать $httpBackend и отвечать на что-то разумное, например
httpBackend.whenGET('directives/listview/view.html').respond("<div>som</div>");
Но на самом деле я хочу просто вернуть фактический файл, а также сделать это синхронно, поэтому нет проблем с ожиданиями, отложенными объектами и т.д. Как это сделать?
Ответы
Ответ 1
Теперь я использую https://github.com/karma-runner/karma-ng-html2js-preprocessor. То, что он делает, это чтение во всех используемых вами шаблонах, преобразование их в шаблоны Angular и их установка в шаблон $templateCache, поэтому, когда ваше приложение нуждается в них, оно будет извлекать их из кеша и не запрашивать их с сервера.
В моей карточной конфиге
files: [
// templates
'../**/*.html'
],
preprocessors : {
// generate js files from html templates
'../**/*.html': 'ng-html2js'
},
ngHtml2JsPreprocessor: {
// setting this option will create only a single module that contains templates
// from all the files, so you can load them all with module('templates')
moduleName: 'templates'
},
И затем в тесте, выполните
// Load templates
angular.mock.module('templates');
И он работает!
Ответ 2
Обязательно включите модуль ngMockE2E в ваш beforeEach
Если вы не используете mock-сервисы $browser, не будут создаваться при вызове whenGET
, а возвращаемое значение не будет устанавливать функцию passThrough
beforeEach(function() {
module('yourModule');
module('ngMockE2E'); //<-- IMPORTANT!
inject(function(_$httpBackend_) {
$httpBackend = _$httpBackend_;
$httpBackend.whenGET('somefile.html').passThrough();
});
});
Место в angular -mocks.js, где это настроено:
Исходный код находится в функции $httpBackend mock when
:
function (method, url, data, headers) {
var definition = new MockHttpExpectation(method, url, data, headers),
chain = {
respond: function(status, data, headers) {
definition.response = createResponse(status, data, headers);
}
};
if ($browser) {
chain.passThrough = function() {
definition.passThrough = true;
};
}
definitions.push(definition);
return chain;
}