我正在使用qunit和mockjax测试我的前端代码。 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();
});
* $.mockjaxClear()
Removes all mockjax handlers.
我不明白为什么在mockjaxClear
电话后立即调用$.ajax()
。问题是如果它进行某种清理,正如文档所说,这个清理将在 AJAX响应到来之前运行(请参阅this jsfiddle的控制台)。在complete
事件的处理程序中进行清理似乎更合乎逻辑。 任何人都可以解释为什么在$.ajax()
之后调用mockjaxClear会更好吗?
答案 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
生命周期钩子中,以使您的实际测试代码更紧凑,只关注测试本身,而不是设置/拆卸。