Jasmine - 从Ajax内部成功调用了DOM元素的测试方法

时间:2016-08-04 20:51:49

标签: javascript ruby-on-rails unit-testing jasmine

我对Jasmine完全不熟悉,不确定我是否正确接近。我想测试在我的table dom元素上调用DataTable()方法。这应该发生在成功的ajax响应上。但是,它在ajax调用中初始化,我不知道如何测试它。进行ajax调用的javascript函数是updateResults()

这是我尝试过的。

describe('#ajax', function () {
    var leaderboards, spyOnAjax;
    var formActionUrl = '/jasmine_test_url';

    beforeEach(function () {
        setFixtures('<div class="lb-container">' +
            '<form class="leaderboard" action="' + formActionUrl + '">' +
            '<input type="submit">' +
            '</form>' +
            '<div id="result-box">' +
            '<table class="table-leaderboard"></table> </div>' +
            '</div>');
        leaderboards = new LeaderBoards($('div.lb-container')[0]);
        spyOnAjax = spyOn($, 'ajax').and.callThrough();
        leaderboards.updateResults();
    });

    describe('when updateResults method is called on leaderboards object', function () {

        it('initializes DataTables', function () {
            var table = $('table.table-leaderboard');
            spyOn(table, 'DataTable');
            expect(table.DataTable).toHaveBeenCalled();
        });
    });
});

Jasmine告诉我,已经调用了预期的间谍DataTable。 我似乎没有正确获取表元素。任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:0)

我看到有两种可能性:

  1. 在ajax调用完成后,您正在将间谍添加到DataTable。通常,在进行其他设置时,应在beforeEach块中创建间谍。
  2. 您的ajax调用是异步的,您需要在创建DataTable之前侦听要解析的调用。
  3. 但是,一般情况下,您不应该在单元测试中发出ajax请求。所有这些测试都应该是自包含的,而不是依赖于外部服务。