Qunit错误:在测试上下文之外断言

int*_*rgc 11 javascript qunit

我全身都搜索过,看来这个错误是由于没有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

谁能看到我哪里出错了?

Dav*_*ess 7

据我所知,我同意您的代码与文档相符.

更新

即使文档没有显示它,我想知道你是否必须告诉QUnit在某个时刻停止,所以它知道在测试函数返回后等待.我认为QUnit假设这是因为它是一个异步测试,但它值得一试.

asyncTest('mytest', 1, function() {
    stop();
    ...
});
Run Code Online (Sandbox Code Playgroud)

我一直在使用Sinon.JS来避免首先进行AJAX调用.这有三个直接的好处:

  1. 我不依赖服务器来响应请求.
  2. 我可以为每个测试指定不同的结果.
  3. 测试运行得更快.

模拟可以在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)