我全身都搜索过,看来这个错误是由于没有asyncTest正确使用.但是,根据文档,我似乎正确地做到了.我猜我在某个地方错过了一个小细节,需要一双额外的眼睛......
我正在尝试测试一些代码,这些代码生成ajax请求以获取页面,然后将其加载到灯箱中. lightbox-content在ajax调用完成并且可以显示之前,它不会显示在DOM中.所以,我只能在我的onComplete回调中检查它,这是我测试它是否正确加载它的地方.
这是我的代码:
asyncTest('mytest', 1, function() {
utils.lightbox.show('/login', {
onComplete: function() {
ok($('#lighbox-content').is(':visible'), 'Lightbox loaded the /login page.');
start();
}
});
});
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Uncaught Error: assertion outside test context, was at HTMLDivElement.window.utils
谁能看到我哪里出错了?
据我所知,我同意您的代码与文档相符.
更新
即使文档没有显示它,我想知道你是否必须告诉QUnit在某个时刻停止,所以它知道在测试函数返回后等待.我认为QUnit假设这是因为它是一个异步测试,但它值得一试.
asyncTest('mytest', 1, function() {
stop();
...
});
Run Code Online (Sandbox Code Playgroud)
我一直在使用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();
});
Run Code Online (Sandbox Code Playgroud)