我可以在加载之前将globals注入到Node模块中吗?

我正在编写一个应用程序的目的是为浏览器,我想为我的库代码编写自动化testing。 我想在Node之外的命令行环境中运行这些testing。 我还没有select一个testing框架,虽然我倾向于像摩卡或茉莉花这样的BDD框架。

我的代码依赖于Knockout的可观察属性。 不幸的是,Knockout库不仅包含可观察的属性,还包含将它们绑定到DOM的代码。 所以,如果我只是试图从Node节点require()敲出Knockout库,我会得到错误,因为库试图引用Node中未定义的windownavigatordocumentvariables。 Knockout实际上并不使用任何这些variables – 它主要是对DOM绑定进行一些特征检测,这对我来说并不重要,但是因为它确实使用了它们,所以Node甚至不会加载文件。

所以这里是我的问题: 我可以注入虚拟variables加载模块? 我可以做些什么来说:“加载源文件之后,但在开始运行之前,让我在模块中设置一些variables,以便代码能够成功运行”?

我知道CoffeeScript已经修补了Node的模块加载器,所以除了.js之外,它还可以加载.coffee文件; 所以似乎也可能有一些方法来修补它来注入variables,如果我只知道如何。

是的,是的,你可以 – 创build它们,然后使用它们,全局variables没有隔离。

或者,你可能想要在代码中用文字包装一个垫片,在闭包中提供它们。 jsdom做这样的事情来运行jQuery。 (它提供了一个真正的DOM!)

Node.js并不是一个常用的(无头浏览器 )意义上的“无头”环境。

jsdom可以带你进一步,但你应该看看PhantomJS ,这是无头的webkit,与DOM和所有,应该适合你的用例完美。

也许使用felixge的节点沙盒模块 ,你可以沙盒淘汰库,并将全局注入沙盒模块。

自述文件:

 var SandboxedModule = require('sandboxed-module'); var user = SandboxedModule.require('./user', { requires: {'mysql': {fake: 'mysql module'}}, globals: {myGlobal: 'variable'}, locals: {myLocal: 'other variable'}, });