Тестирование возвращаемого значения шпионских методов с использованием Jasmine

Полное раскрытие... это мой первый ТАК вопрос. Пожалуйста, будьте любезны, если я что-то упущу. ;-)

Я начинаю использовать 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, который заставит эти методы вызываться автоматически, поэтому я не могу создать объект таблицы, а затем установить шпион для этих методов.

7
задан ShatyUT 23 April 2012 в 20:01
поделиться