单元错误:测试上下文之外的断言

Qunit error: assertion outside test context

本文关键字:断言 上下文 错误 测试 单元      更新时间:2023-09-26

我已经搜索过了,似乎这个错误是由于没有正确使用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

有人能看出我错在哪里吗?

就我所知,我同意你的代码符合文档。

即使文档没有显示它,我想知道您是否必须告诉QUnit在某个点停止,以便它知道在测试函数返回后等待。我认为QUnit假定了这一点,因为它是一个异步测试,但值得一试。

asyncTest('mytest', 1, function() {
    stop();
    ...
});

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

  1. 我不依赖服务器来响应请求。
  2. 我可以为每个测试指定不同的结果。
  3. 测试运行得更快。
mock可以在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();
});

我已经找到了一个解决方案,希望你的问题有相同的来源。

用文字解释:

    我有一个复杂的异步测试
  • 我有延迟事件,有okequal断言在
  • 当然,所有这些都包含在asyncTest 中。
  • 但是,当测试"完成"并且我调用start()时,事件处理程序仍然存在
  • 在调用start()之后,okasyncTest内部的所有进一步调用都是非法的
  • 抛出异常
  • 我想知道如果超过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()的测试时,onloadonerror事件仍然可以发生。