【问题标题】:Test ajax call with qunit and mockjax使用 qunit 和 mockjax 测试 ajax 调用
【发布时间】:2015-01-08 15:33:44
【问题描述】:

我正在尝试测试一个 ajax 调用。我需要使用正确的数据和结果来测试是否调用了正确的 url。从这个失败的测试开始。我得到的错误是“预期:已保存,实际:”。

我的淘汰视图模型中的功能 -

self.functions.save = function () {
    $.ajax({
        url: '/x',
        data: { test: "" },
        dataType: "json",
        success: function (response) {
            self.saved(response.message);
        }
    });
};

Qunit 测试 -

test('save does ajax call', function () {
        $.mockjax({
            url: '/x',
            dataType: 'json',
            responseText:
                {
                    message: 'saved'
                }
        });
        mock.functions.save();
        equal(mock.saved(), "saved");
});

【问题讨论】:

  • 您应该在成功回调中添加console.log(response) 语句,以查看您的 mockajax 是否正确配置并返回了预期的响应...

标签: knockout.js qunit mockjax


【解决方案1】:

这里的问题是执行顺序。您的 save() 方法执行异步操作,而 Mockjax 尊重这一点。因此,当您在测试中调用mock.functions.save(); 时,该函数立即返回,这意味着您的equal() 断言在源代码中ajax 调用的success 处理程序之前触发。您需要添加一些方法让测试知道 Ajax 调用何时完成。在下面的示例中,我使用了一个简单的回调,但您也可以使用 Promises 或其他方法来执行此操作。

源代码:

self.functions.save = function (callback) {
    callback = callback || function(){};  // ensure we have a callback
    $.ajax({
        url: '/x',
        data: { test: "" },
        dataType: "json",
        success: function (response) {
            self.saved(response.message);
        },
        // when the call is finished, execute the callback (success or error)
        complete: function () {
            callback();
        }
    });
};

在您的测试中,您需要使用 QUnit 的异步功能。有new way to do async testing in v1.16.0,所以要么更新,要么你去查the old way

QUnit.test('save does ajax call', function (assert) {
    // first tell QUnit you need to perform async actions...
    var done = QUnit.async();

    $.mockjax({
        url: '/x',
        dataType: 'json',
        responseText:
            {
                message: 'saved'
            }
    });
    mock.functions.save(function() {
        // this callback fires when the async action is complete,
        // so now we do our assertions
        assert.equal(mock.saved(), "saved");

        // ...and now we tell QUnit we're done with async actions
        done();
    });
});

【讨论】:

  • 它会起作用,但是为了测试而在代码库中引入额外代码的方法听起来是错误的。
  • 我不认为你理解这个问题。这不是在源代码中引入任意额外的代码行,而是引入了一个回调函数来通知任何调用代码异步操作已完成。否则,除非您设置任意超时,否则无法测试此方法,这是非常糟糕的测试实践。换句话说,添加代码不是“为了测试”,而是为了源代码中适当的异步编码风格而添加的,这也便于测试。
  • 我想我确实理解这个问题,除非你有更强有力的反对理由。我从来没有说过它是任意代码,尽管代码库可以在没有回调的情况下愉快地离开,而不是测试。但是,目前我不知道任何其他可行的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多