Полное раскрытие... это мой первый ТАК вопрос. Пожалуйста, будьте любезны, если я что-то упущу. ;-)
Я начинаю использовать Jasmin для тестирования одного из моих клиентских -объектов Javascript на стороне. Этот объект, в частности, управляет использованием подключаемого модуля jQuery, называемого DataTables . Управляемый компонент DataTables будет вызывать пару пользовательских методов рендеринга, чтобы определить, что отображать для пары столбцов, и я пытаюсь протестировать эти методы.
Короткий вопрос:Как я могу протестировать возвращаемое значение методов, для которых мне нужно поставить шпион?
Предыстория
Вот уменьшенная версия моего объекта Javascript:
function Table(elemId) {
this._table = $('#'+elemId).dataTable({
"aoColumnDefs": [
{
"fnRender": function(oObj, id) {
return Table.renderIdColumn(oObj, id, lTable);
},
"aTargets": ["idColumn"],
"bUseRendered": false
},{
"fnRender": function(oObj, name) {
return Table.renderNameColumn(oObj, name, lTable);
},
"aTargets": ["nameColumn"],
"bUseRendered": false
}
],
"bJQueryUI": true,
"sPaginationType": "full_numbers"
});
}
Table.renderIdColumn = function(oObj, id, lTable) {
return '';
};
Table.renderNameColumn = function(oObj, name, lTable) {
var id = oObj.aData[0];
return '' + name + '';
};
Итак, при создании объекта Table мне нужно перехватить вызов Table.RenderIdColumn и Table.renderNameColumn, чтобы я мог утвердить результаты. Вот что у меня есть в Jasmine на данный момент:
describe("Table", function() {
var lTable;
// Write a DOM table that will be rendered by the jQuery DataTable plugin
beforeEach(function() {
$('
').appendTo('body');
var headerCellClasses = ["idColumn","nameColumn"];
var headerRow = $(' ');
$.each(headerCellClasses, function(index, value) {
headerRow.append(' ')
});
$('').append(headerRow).appendTo('#lTable');
$('').appendTo('#lTable');
});
afterEach(function() {
// First remove DataTables enhancements
lTable.fnDestroy();
// Now remove from DOM
$('#lTable').remove();
});
describe("when edit links are shown", function() {
it("should render a checkbox in ID column", function() {
spyOn(Table, "renderIdColumn");
lTable = initializeDataTable();
var oSettings = lTable._table.fnSettings();
var id = 1;
var obj = {
oSettings: oSettings,
iDataColumn: 0,
iDataRow: 0,
mDataProp: 0,
aData: oSettings.aoData[0]._aData
}
var expected = '';
expect(Table.renderIdColumn).toHaveBeenCalledWith(obj, id, lTable);
var results = Table.renderIdColumn(obj, id, lTable);
expect(results).toEqual(expected);
});
it("should render the name column with a proper link", function() {
spyOn(Table, "renderNameColumn");
lTable = initializeDataTable();
var oSettings = lTable._table.fnSettings();
var name = "Name";
var obj = {
oSettings: oSettings,
iDataColumn: 3,
iDataRow: 0,
mDataProp: 3,
aData: oSettings.aoData[0]._aData
}
var expected = 'Name';
expect(Table.renderNameColumn).toHaveBeenCalledWith(obj, name, lTable);
var results = Table.renderNameColumn(obj, name, lTable);
expect(results).toEqual(expected);
});
});
});
function initializeDataTable() {
// Mock the AJAX call to the server from DataTables plugin
spyOn($.fn.DataTable.defaults, "fnServerData").andCallFake(function( sUrl, aoData, fnCallback, oSettings ) {
var json = {
iEcho: 1,
iTotalRecords: 1,
iTotalDisplayRecord: 1,
aaData: [
[1, "Name"]
]
}
fnCallback(json);
});
return new Table("lTable");
}
В обоих тестовых примерах переменная «результаты» «не определена». Мне нужно протестировать эти методы, чтобы убедиться, что они отображают правильный HTML, но я не могу понять, как утвердить возвращаемые значения. Когда у меня есть шпион на методе, он, похоже, ничего не возвращает.Я пытался вставить
Table.renderIdColumn.reset();
Table.renderNameColumn.reset();
, но ни один из них ничего не сделал... может быть потому, что мои методы статичны? К вашему сведению, эти методы являются статическими, потому что я не могу правильно назначить «шпиона», если они являются методами экземпляра. Конструктор таблицы вызывает подключаемый модуль DataTables, который заставит эти методы вызываться автоматически, поэтому я не могу создать объект таблицы, а затем установить шпион для этих методов.