Хорошо, я пытаюсь проверить результат функции, которая обновляет DOM> У меня есть директива, которая загружает шаблон через URL-адрес. Затем контроллер вызывает фабричный метод для обновления таблицы html данными. У меня есть тесты, показывающие, что я могу получить все данные, которые хороши. но как я могу проверить, что обновления таблицы произошли?
Я использую NodeJS с Karma и Jasmine.
Я следил за учебными пособиями о том, как загружать шаблоны, и у меня это работает, я могу загружать и получать доступ к шаблонам в своем тесте в порядке.
но когда я запускаю метод для обновления таблицы, тесты терпят неудачу.
Я приведу уменьшенный пример того, что я пытаюсь сделать. Обратите внимание, это всего лишь демонстрационный код, а не рабочее приложение.
Шаблон.
<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);
}
)
}])
Модульный тест
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');
});
});
});
Тестовый выход
Ожидается, что 0 будет 1. Ожидается, что '' будет 'someData'.
Если я вставлю код updateTable в контроллер и вызову там функцию обновления, тест пройдет, но я бы хотел, чтобы это было на фабрике, как я могу сделать этот тест пройденным (приложение работает и работает, как и ожидалось, я просто не могу получить рабочий тест).
Я понимаю, что этот тип тестирования больше ориентирован на пользовательский интерфейс, а не на «модульное тестирование», но возможно ли это сделать?