2013-05-13 38 views
5

我有一套使用瀏覽器端但經過摩卡測試的服務器端的對象。我正在使用require.js進行AMD加載。該Require.js網站建議使用服務器端amdefine得到定義的模塊在node.js的工作,這段代碼:是否可以在測試中設置amdefine,以便我不必在所有模塊文件中定義它?

if (typeof define !== 'function') { 
    var define = require('amdefine')(module) 
} 

確定。但是我必須將其放入我想在Node中使用的每個模塊中。在我的情況下,這意味着我必須從我使用客戶端(大部分)的任何代碼中剝離它。

我想知道是否有任何方法可以將這段代碼放在我的測試中,以便我不必將其放入我的客戶端代碼中。在我的文件中只有測試需要使用代碼似乎很愚蠢 - 將它放在測試代碼中更有意義。然而,當我這樣做,我得到一個錯誤:

Error: amdefine with no module ID cannot be called more than once per file. 
    at runFactory (/home/vmplanet/dev/alpha/web/node_modules/amdefine/amdefine.js:159:23) 
    at define (/home/vmplanet/dev/alpha/web/node_modules/amdefine/amdefine.js:275:13) 
    at Object.<anonymous> (/home/vmplanet/dev/alpha/web/assets/src/coffee/delta/dataLayer.coffee:4:3) 
    at Object.<anonymous> (/home/vmplanet/dev/alpha/web/assets/src/coffee/delta/dataLayer.coffee:158:4) 
    at Module._compile (module.js:456:26) 
    at Object.loadFile (/usr/lib/node_modules/coffee-script/lib/coffee-script/coffee-script.js:179:19) 
    at Module.load (module.js:356:32) 
    at Function.Module._load (module.js:312:12) 
    at Module.require (module.js:364:17) 
    at require (module.js:380:17) 

這是一個奇怪的錯誤,因爲amdefine代碼是隻在一個地方 - 測試文件的頂部。有沒有辦法把這個amdefine代碼放在我的測試中,只有我的測試,並仍然得到測試運行服務器端 - 而不必刪除客戶端的amdefine代碼?

回答

2

如果使用amd-loader,你可以這樣做:

require("amd-loader"); 
var datatypes = require("../build/dist/lib/salve/datatypes"); 
var name_resolver = require("../build/dist/lib/salve/name_resolver"); 

就是這樣。你只需要amd-loader,然後你可以隨意加載AMD風格的模塊。 (在上面的例子中,在amd-loader之後加載的兩個模塊是AMD風格的模塊。)而AMD風格的模塊可以加載其他AMD風格的模塊。

上面的代碼片段是one of my test suites的實際代碼,它測試了一個設計爲AMD風格的庫,以便它可以使用RequireJS加載,但是在Node.js中進行了測試。

+0

這非常有趣。我會看一看。謝謝你回答這個問題,就像這個一樣塵土飛揚。 – jcollum 2014-01-30 15:42:51

+0

我想有人可能會受益。 – Louis 2014-01-30 15:45:16

+0

https://github.com/ajaxorg/node-amd-loader這是一個權利? – jcollum 2014-01-30 16:09:33

相關問題