2014-03-28 73 views
2

我有一個簡單的摩卡測試,使用requirejs和context配置時失敗。requirejs摩卡上下文錯誤

這裏的A.js

define([], function(){ 
    return {}; 
}); 

這裏的測試spec.js

var requirejs = require('requirejs'); 

var localReq = requirejs.config({ 
    baseUrl: "./", 
    context: "context1" 
}) 

describe("context test", function() { 
    it("should not throw error", function() { 
     for (var i = 0; i < 100; i++) { 
      console.log(localReq("A"), i); 
     } 
    }); 
});  

當我運行測試mocha spec.js,我得到以下錯誤:

未捕獲的錯誤:試圖加載 「A」 的/Users/khirakawa/work/test/node_modules/mocha/bin/A.js,然後嘗試節點的要求(「A」),它失敗,錯誤:錯誤:找不到獨樂 'A'

以下是截圖:

fail

通知A是如何正確地加載和記錄的100倍,但試驗還是失敗了。如果我註釋掉context配置,它工作得很好。

摩卡還打印出「1個傳」和「1次失敗」,即使只有1測試。

這是怎麼發生的?

回答

0

你可以寫你的測試是這樣的:

describe("context test", function() { 
    it("should not throw error", function (done) { 
     localReq(["A"], function (f) { done(); }); 
    }); 
}); 

正如你在評論中指出,呼籲localReq得到一個模塊同步should work但對於一些無法解釋原因,事實並非如此。上面的代碼調用localReq來異步加載模塊。

原因摩卡是在說,你的單身測試及格和不及格是,它是檢測這種情況發生後,你的測試已經結束,並沒有其他的測試將其與相關聯的錯誤。這種錯誤信息在同一測試通過和失敗的情況下可以肯定地表明,你有異步發生的事情,但你沒有在你的Mocha測試設置中處理它。

+0

謝謝Louis!從瀏覽器的角度來看,你的解釋很有意義在node-land中我不明白的是:1)requirejs的文檔聲明「...在Node中運行時,將使用同步IO調用加載模塊加載,並且加載器插件應該同步地解析對其加載方法的調用。」它沒有說模塊需要先加載的任何地方。 2)如果我使用「_」的默認上下文,我的測試用例就可以工作,並且3)如果我將A中返回的內容更改爲{test:「test」},它將打印{test:「test」} 100次,這表明它是同步加載的。 –

+0

你說得對,我爲什麼要求(「A」)失敗的解釋不是目標。然而,很顯然,RequireJS *實際*做的是與文檔不一致。否則,你的代碼將工作。在這一點上,它看起來像一個bug。 – Louis

+0

謝謝Louis,在這裏打開了一張票https://github.com/jrburke/r.js/issues/662 –