qunit + mockjax:我什么时候应该在异步测试中调用mockjaxClear?

时间:2013-09-05 13:42:23

标签: javascript jquery ajax qunit mockjax

我正在使用qunitmockjax测试我的前端代码。 mockjax's own test code中的AJAX测试结构如下所示(jsfiddle):

var testURL = "/test/data",
    testData = { a: 1, b: "c" };

asyncTest("AJAX response test", 1, function() {
    $.mockjax({
        url: testURL,
        responseText : JSON.stringify(testData)
    });

    $.ajax({
        url: testURL,
        dataType: "json",
        success: function(data) {
            deepEqual(data, testData, 'AJAX response is OK');
        },
        complete: function() {
            start();
        }
    });

    $.mockjaxClear();
});

根据mockjax documentation

* $.mockjaxClear() 
    Removes all mockjax handlers.

我不明白为什么在mockjaxClear电话后立即调用$.ajax()。问题是如果它进行某种清理,正如文档所说,这个清理将在 AJAX响应到来之前运行(请参阅this jsfiddle的控制台)。在complete事件的处理程序中进行清理似乎更合乎逻辑。 任何人都可以解释为什么在$.ajax()之后调用mockjaxClear会更好吗?

2 个答案:

答案 0 :(得分:3)

如果您查看代码,您将看到清理不会影响已经“正在运行”的调用。它只是确保任何后续$.ajax()将调用jQuery的原始方法,并清除其他内部状态(但同样,不影响已经挂起的“请求”)。

这可能有助于确保$.ajax()调用测试只发送一次(如果发送的更多,则会失败,而且会再次调用start()方法,将错误报告给Qunit )。

这也可能只是为了保持代码干净(回调处理程序中的东西少)。

答案 1 :(得分:2)

我认为您实际上不应该在测试中的任何位置运行$.mockjaxClear。 QUnit为在模块中运行的测试提供生命周期钩子,在这种情况下重要的是被拆除。

http://api.qunitjs.com/module/

使用它,你的代码应该是

module( "myapi", {
    teardown: function() {
        $.mockjaxClear();
    }
});

asyncTest( "sometest", function() {
    // test definition
});

如果您愿意,您甚至可以将模拟设置移动到setup生命周期钩子中,以使您的实际测试代码更紧凑,只关注测试本身,而不是设置/拆卸。