Хорошо, я пытаюсь проверить результат функции, которая обновляет DOM> У меня есть директива, которая загружает шаблон по URL-адресу. Затем контроллер вызывает фабричный метод для обновления таблицы html данными. У меня есть тесты, показывающие, что я могу получить данные, которые все хороши. , но как я могу проверить, что произошли обновления таблицы?Угловое тестирование DOM после обновления Factory
Я использую NodeJS с кармой и жасмином.
Я следил за учебниками по загрузке в шаблонах, и у меня есть эта работа, я могу загрузить и получить доступ к шаблонам в своем тестовом порядке.
, но когда я запускаю метод обновления таблицы, тесты терпят неудачу.
Я дам уменьшенный пример того, что я пытаюсь сделать. Заметьте, это всего лишь демо-код, а не работающее приложение.
Шаблон.
<table><tr><td class="cell1"></td></tr></table>
Директива.
dataTable.directive('dataTable', function() {
return {
restrict: 'E',
templateUrl: 'path/to/template/dataTable.html'
};
});
Контроллер
dataTable.controller('dataTableController', ['$scope', 'dataTableFactory',
function ($scope, dataTableFactory){
$scope.updateTable = function(){
dataTableFactory.loadData();
// code to load data from dataTableFactory here! //
dataTableFactory.updateTable();
}
}])
завод
dataTable.factory('dataTableFactory',['$document',function($document){
var _tableData;
return(
"tableData": _tableData,
loadData: function(){
// code to get data and populate _tableData.
}
updateTable: function(){
$document.find('.cell1').append(this.tableData.data);
}
)
}])
Unit Test
describe('dataTable Tests', function() {
var scope, element, $compile, mDataTableFactory, controller, tableData, doc, factory;
beforeEach(module('dataTable'));
beforeEach(module('app.templates')); // setup via ng-html2js
beforeEach(inject(function (_$rootScope_, _$compile_,_$controller_,_dataTableFactory_) {
scope = _$rootScope_.$new();
doc = _$compile_('<flood-guidance></flood-guidance>')(scope);
factory = _dataTableFactory_;
controller = _$controller_('dataTableController', {
$scope: scope,
$element: doc,
dataTableFactory: factory
});
scope.$digest();
}));
it("Template should contain the cell cell1", function(){
expect(doc.find('.cell1').contents().length).toBe(0);
expect(doc.find('.cell1').html()).toBeDefined();
});
// Passes fine, so I know the template loads ok.
it('Should show data in cell1',function(){
factory.tableData = {data: 'someData'};
scope.updateTable();
expect(doc.find('.cell1').contents().length).toBe(1);
expect(doc.find('.cell1').html()).toBe('SomeData');
});
});
});
Тест Ouptut
Ожидается, что 0 будет 1. Ожидается '' быть 'некоторыми данными'.
Если я помещаю код updateTable в контроллер и вызываю функцию обновления там, тест проходит, но я хотел бы иметь это на заводе, как я могу сделать этот тестовый проход (приложение запускается и работает, как ожидалось, я просто не могу получить рабочий тест).
Я понимаю, что такое тестирование больше ориентировано на пользовательский интерфейс, а не на «Unit Testing», но возможно ли это сделать?
Извините, возможно, недостаточно объяснил себя. Данные отображаются в ячейке таблицы отлично, например, если я обычно запускаю приложение (т. Е. В браузере). Его в тесте, что он терпит неудачу, потому что я не могу получить обновленную DOM, я получаю исходный DOM без данных, добавленных в ячейку. Мне нужно знать, как тестировать DOM. После его обновления с помощью updateTable. Мне нравится ваша идея с настройкой переменных и получением, я все равно это реализую. – Status420
Я обновил свой ответ скрипкой. Все еще не уверен, что это то, что вам нужно, но восстановленный пример может помочь вам в вашем путешествии. – zewa666
Ну с помощью метода setter вы также можете это сделать. Процесс установки Dom остается прежним, я думаю, что вы действительно хотите проверить, это само значение. В нескольких ячейках просто используйте ngrepeat внутри шаблона. – zewa666