我已经全部搜索了,看来这个错误是由于没有正确使用asyncTest
。但是,根据文档,我似乎正确地做到了。我猜我在某个地方错过了一个小细节,需要一双额外的眼睛......
我正在尝试测试一些代码,这些代码生成ajax请求以获取页面,然后将其加载到灯箱中。在ajax调用完成并且可以显示之前,lightbox-content
不会显示在DOM中。所以,我只能在我的onComplete回调中检查它,这是我测试它是否正确加载它的地方。
这是我的代码:
asyncTest('mytest', 1, function() {
utils.lightbox.show('/login', {
onComplete: function() {
ok($('#lighbox-content').is(':visible'), 'Lightbox loaded the /login page.');
start();
}
});
});
我收到错误:
Uncaught Error: assertion outside test context, was at HTMLDivElement.window.utils
谁能看到我出错的地方?
答案 0 :(得分:7)
我同意您的代码与我所知的文档相符。
<强>更新强>
即使文档没有显示它,我想知道你是否必须告诉QUnit在某个时刻停止,所以它知道在测试函数返回后等待。我认为QUnit假设这是因为它是一个异步测试,但它值得一试。
asyncTest('mytest', 1, function() {
stop();
...
});
我一直在使用Sinon.JS来避免首先进行AJAX调用。这有三个直接的好处:
模拟可以在XMLHttpRequest级别或jQuery方法上完成,非常简单。以下是我的一个测试中的示例:
module("geo", {
setup: function () {
this.server = sinon.fakeServer.create();
},
teardown: function () {
this.server.restore();
}
}
test("returns detected ZIP code", function () {
this.server.respondWith("/geo/detect-zip-from-ip",
[ 200, { "Content-Type": "text/html" }, '90210' ]);
geo.detectZip(function (zip) {
assertThat(zip, is('90210'));
});
this.server.respond();
});
答案 1 :(得分:0)
我已经为我的案例找到了一个解决方案,希望你的问题有相同的来源。
用文字解释:
ok
和equal
断言asyncTest
start()
时,事件处理程序仍然存在start()
后,ok
内asyncTest
的所有进一步来电都变为非法expect
(在你的例子中是第二个参数)中的数字会发生什么。同样的例外?在代码中解释:
asyncTest('mytest', /*1,*/ function() {
function imgLoadedOrFailed (result) {
clearTimeout(imageTimeToLive);
img.off();
ok(result, 'Image in carousel pane has been loaded');
}
var imageTimeToLive = setTimeout(
imgLoadedOrFailed.bind(this, false),
5000),
img = panes[index].find('img:first');
if (img) {
img.on('load', imgLoadedOrFailed.bind(this, true));
img.on('error', imgLoadedOrFailed.bind(this, false));
}
});
// at some point I call: start();
在此示例中,当我“完成”调用start()
的测试时,onload
和onerror
事件仍然可能发生。