2013-05-13 107 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

相关问题