我發現了三個不同的解決方案來解決這個問題,他們都不愉快。
的依賴項內嵌
define('hurp', [], function() {
return {
beans: 'Beans'
};
});
define('durp', [], function() {
return {
beans: 'durp beans'
};
});
require('hurpdhurp', function() {
// test hurpdurp in here
});
的fugly。你必須用許多AMD樣板來混淆你的測試。
莫克載入依賴從不同路徑
這涉及使用單獨的config.js文件來定義爲每個點嘲笑而不是原來的依賴關係的依賴關係的路徑。這也很醜陋,需要創建大量的測試文件和配置文件。
假貨在節點
這是我目前的解決方案,但仍然是一個可怕的一個。
您可以創建自己的define
函數來爲模塊提供自己的模擬並將您的測試置於回調中。然後你eval
模塊運行測試,就像這樣:
var fs = require('fs')
, hurp = {
beans: 'BEANS'
}
, durp = {
beans: 'durp beans'
}
, hurpDurp = fs.readFileSync('path/to/hurpDurp', 'utf8');
;
function define(deps, cb) {
var TestableHurpDurp = cb(hurp, durp);
// now run tests below on TestableHurpDurp, which is using your
// passed-in mocks as dependencies.
}
// evaluate the AMD module, running your mocked define function and your tests.
eval(hurpDurp);
這是我的首選解決方案。它看起來有點神奇,但它有一些好處。
- 在節點中運行你的測試,所以不要搞亂瀏覽器自動化。
- 在您的測試中不需要凌亂的AMD樣板。
- 你在憤怒中使用
eval
,想象克羅克福德憤怒地爆炸。
顯然它仍然有一些缺點。
- 由於您正在測試節點,因此您無法對瀏覽器事件或DOM操作進行任何操作。只適用於測試邏輯。
- 還是有點笨重的設置。您需要在每次測試中剔除
define
,因爲這是您的測試實際運行的地方。
我在測試運行工作,給出這種東西用優雅的語法,但我仍然有問題沒有很好的解決辦法1.
結論
在requirejs懲戒DEPS吸硬。我發現了一種可行的方法,但對它仍然不滿意。請讓我知道你是否有更好的想法。
我只是做一些瘋狂的東西的eval在node.js中嘲笑了'define'功能。儘管有幾個不同的選擇。我會發佈一個答案,希望它會有幫助。 – jergason 2012-07-27 16:10:53
對於使用Jasmine進行單元測試,您可能還想快速查看[Jasq](https://github.com/biril/jasq)。 [免責聲明:我維護庫] – biril 2014-10-08 16:43:23
如果你在節點env中測試,你可以使用[require-mock](https://github.com/ValeriiVasin/requirejs-mock)包。它允許你輕鬆地模擬你的依賴關係,替換模塊等。如果你需要瀏覽器env與異步模塊加載 - 你可以嘗試[Squire.js](https://github.com/iammerrick/Squire.js/) – ValeriiVasin 2015-03-23 10:27:35