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

Javascript Qunit错误:测试上下文之外的断言,javascript,qunit,Javascript,Qunit,我搜索了所有地方,发现这个错误是由于没有正确使用asyncTest造成的。然而,根据文档,似乎我做的是正确的。我猜我遗漏了一个小细节,需要一双额外的眼睛 我正在测试一些代码,这些代码发出ajax请求以获取页面,然后将其加载到lightbox中lightbox内容在ajax调用完成并可以显示之前不会显示在DOM中。因此,我只能在onComplete回调中检查它,这是我测试的地方,以查看它是否正确加载 这是我的密码: asyncTest('mytest', 1, function() { u

我搜索了所有地方,发现这个错误是由于没有正确使用
asyncTest
造成的。然而,根据文档,似乎我做的是正确的。我猜我遗漏了一个小细节,需要一双额外的眼睛

我正在测试一些代码,这些代码发出ajax请求以获取页面,然后将其加载到lightbox中<代码>lightbox内容在ajax调用完成并可以显示之前不会显示在DOM中。因此,我只能在onComplete回调中检查它,这是我测试的地方,以查看它是否正确加载

这是我的密码:

asyncTest('mytest', 1, function() {
    utils.lightbox.show('/login', {
        onComplete: function() {
            ok($('#lighbox-content').is(':visible'), 'Lightbox loaded the /login page.');
            start();
        }
    });
});
我得到一个错误:

Uncaught错误:测试上下文之外的断言位于htmldevelment.window.utils


有人知道我哪里出错了吗?

就我所知,我同意您的代码与文档相匹配

更新

即使文档没有显示它,我想知道您是否必须告诉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();
    });
    

    我已经为我的案例找到了解决方案,希望你的问题也有相同的根源

    用文字说明:

    • 我有一个复杂的异步测试
    • 我有延迟事件,里面有
      ok
      equal
      断言
    • 当然,所有这些都包装在
      asyncTest
    • 但是,当测试“完成”并且我调用
      start()
      时,事件处理程序仍保留在那里
    • 调用
      start()
      后,在
      asyncTest
      中对
      ok
      的所有进一步调用都将变为非法
    • 并抛出异常
    • 我想知道如果超出
      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
    事件仍然会发生。

    谢谢David。我来试试看。我仍然对Qunit问题感兴趣。这对我来说是“停止();”的事情。谢谢提醒。:)@在RGC中,解决这个问题的运气好吗?
    lighbox内容中缺少的
    t
    是否是发布问题时的一个打字错误?我有相同的错误消息,错误出现在
    on('load'
    callback中,而不是onComplete中,但我认为这在幕后是一样的。您是否尝试过降级到不同的QUnit版本?