$compile не компилирует шаблоны в Karma/Jasmine
Я проверил это с PhantomJS и Chrome.
После этого вопроса я пытаюсь получить доступ к сгенерированному HTML-коду в модульных тестах с Karma:
it('Should do something', inject(function ($rootScope, $templateCache, $compile) {
var scope = $rootScope.$new();
scope.$digest();
var template = $templateCache.get('/app/views/mytemplate.html');
var compiler = $compile(template);
var compiledTemplate = compiler(scope);
console.log(compiledTemplate);
}));
Я обнаружил, что шаблон выбирается правильно и соответствует сырому HTML-файлу на моем компьютере. Но compiledTemplate никогда не компилируется правильно; По сути, Angular удаляет все теги ng с тегами и заменяет их комментариями, независимо от того, какими должны быть их значения.
Например,
<ol ng-repeat = "foo in foos">
<li>foo</li>
</ol>
Всегда будет заменен на:
<!-- ngRepeat: foo in foos -->
Даже если я специально установил scope.foos
в некоторый массив в модульном тесте. Я попытался добавить методы waitsFor и setTimeout, чтобы заставить Karma ждать до 8 секунд, и это все еще поведение, которое я получаю. Я также протестировал свойства CSS и обнаружил, что Карма правильно их устанавливает. Например, div ng-show или ng-hide будет иметь ожидаемые свойства CSS, но для директив, которые должны изменять скомпилированный HTML, все заменяется комментарием.
Есть ли способ получить измененную Angular DOM-структуру HTML в модульных тестах? То есть не только HTML-код с удаленными угловыми элементами, но и какой Angular на самом деле его изменяет?
1 ответ
Вы должны сделать $digest()
после компиляции. После дайджеста, compiledTemplate.find('ol')
(с scope.foos
как некоторый массив) должен возвращать ng-повторяющиеся элементы.