2013-06-05 30 views
12

我已經遍尋搜索,看來這個錯誤是由於沒有正確使用asyncTest。但是,根據文檔,似乎我正確地做到了。我猜我錯過了一個小細節的地方,需要一個額外的眼睛...Qunit錯誤:在測試環境之外斷言

我試圖測試一些代碼,使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

任何人都可以看到我要去哪裏錯了嗎?

+1

在發佈您的問題時,「lighbox-content」中是否缺少't'字樣? –

+0

我有同樣的錯誤信息,錯誤出現在'on('load''回調,而不是onComplete,但我認爲它都是一樣的引擎蓋下。你試過降級到不同的QUnit版本? – Dan

回答

7

我同意您的代碼與文檔相符,據我所知。

更新

即使文檔不顯示它,我不知道如果你必須告訴QUnit停在某一點,所以它知道測試函數返回後等待。我認爲QUnit會假設這是因爲它是異步測試,但它值得一試。

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

我一直在使用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(); 
}); 
+0

謝謝大衛。我還會對Qunit問題感興趣 – intargc

+0

對我來說這是「停止()」的事情,感謝提醒它:) – joaorodr84

+0

@intargc任何運氣都能解決這個問題問題? –

0

我已經找到了解決方案,希望您的問題具有相同的來源。

在解釋詞:

  • 我具有複雜的異步測試
  • 我已延遲的事件,並有內部
  • 當然okequal斷言,這一切都被包裹內部asyncTest
  • 但是,當測試「完成」並且我致電start()時,事件處理程序仍在那裏
  • Af之三呼叫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(); 

在這個例子中,當I 「完成」 測試呼叫start(),則onloadonerror事件仍然可能發生。