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

时间:2013-06-05 20:22:12

标签: javascript qunit

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

谁能看到我出错的地方?

2 个答案:

答案 0 :(得分:7)

我同意您的代码与我所知的文档相符。

<强>更新

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

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

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

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

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

用文字解释:

  • 我有一个复杂的异步测试
  • 我有延迟事件,内部有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事件仍然可能发生。