我可以在加载之前将全局变量注入Node模块吗?

时间:2012-01-16 00:46:03

标签: unit-testing node.js knockout.js

我正在编写一个发往浏览器的应用程序,我想为我的库代码编写自动化测试。我想在浏览器之外,在Node之类的命令行环境中运行这些测试。我还没有选择测试框架,但我倾向于像MochaJasmine这样的BDD框架。

我的代码取决于Knockout的可观察属性。不幸的是,Knockout库不仅包含可观察的属性,还包含将它们绑定到DOM的代码。因此,如果我只是尝试require()来自Node的Knockout库,我会收到错误,因为该库正在尝试引用未定义的windownavigatordocument变量在节点中。 Knockout实际上并没有使用任何这些变量很多 - 它主要只是对DOM绑定的一些特征检测,这对我来说无关紧要 - 但是因为它确实使用了它们,Node甚至不会加载文件。

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

我知道CoffeeScript已经修补了Node的模块加载器,因此除了.coffee之外,它还可以加载.js个文件。因此,如果我只知道如何,似乎也可能有某种方法来修补它以注入变量。

3 个答案:

答案 0 :(得分:2)

是的,是的,你可以 - 创建它们然后使用它们,全局变量没有隔离。

或者,您可能希望以文本方式在代码周围包装一个垫片,将它们放在一个闭包中。 jsdom做这样的事情来运行jQuery。 (它为此提供了真正的DOM!)

答案 1 :(得分:0)

Node.js在通常使用的意义上不是“无头”环境(无头浏览器)。

jsdom可以带你走得更远,但你应该研究PhantomJS,这是无头webkit,有DOM和所有,并且应该完全适合你的用例。

答案 2 :(得分:0)

也许使用felixge的节点sandboxed-module,您可以对挖空库进行沙箱化并将全局变量注入沙盒模块。

自述文件:

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