2013-09-05 54 views
1

我使用qunitmockjax来测试我的前端代码。 AJAX的测试中mockjax's own test code结构看起来像这样(jsfiddle):qunit + mockjax:我应该在异步测试中调用mockjaxClear?

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?

+0

自从jquery-mockjax v1.6.0发布2014-10-09,'$ .mockjaxClear()'已被重命名为'$ .mockjax.clear()'。请参阅[ChangeLog](https://github.com/jakerella/jquery-mockjax/blob/master/CHANGELOG.md) – knb

回答

3

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

这可能有助于确保$.ajax()受测试的呼叫只发送一次(如果发送了更多的邮件,它们将失败,此外将再次调用start()方法,将错误报告给Qunit)。

也可以这样保持代码清洁(在回调处理程序中的东西较少)。

+0

谢谢Nikos! – kol

2

我不认为你应该在你的测试中的任何地方实际运行$.mockjaxClear。 QUnit为在模块中运行的测试提供生命周期挂钩,在这种情况下,重要的一个就是拆卸。

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

利用这一点,你的代码应该是这样

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

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

如果你愿意,你甚至可以将您的模拟设置成setup生命周期挂钩,使您的实际测试的代码更紧凑并专注于测试本身,而不是设置/拆卸。