我正在编写一个发往浏览器的应用程序,我想为我的库代码编写自动化测试。我想在浏览器之外,在Node之类的命令行环境中运行这些测试。我还没有选择测试框架,但我倾向于像Mocha或Jasmine这样的BDD框架。
我的代码取决于Knockout的可观察属性。不幸的是,Knockout库不仅包含可观察的属性,还包含将它们绑定到DOM的代码。因此,如果我只是尝试require()
来自Node的Knockout库,我会收到错误,因为该库正在尝试引用未定义的window
,navigator
和document
变量在节点中。 Knockout实际上并没有使用任何这些变量很多 - 它主要只是对DOM绑定的一些特征检测,这对我来说无关紧要 - 但是因为它确实使用了它们,Node甚至不会加载文件。
所以这是我的问题:我可以在加载时将虚拟变量注入模块吗?我可以在您加载源文件之后但在开始运行之前做些什么来说它,让我在模块中设置一些变量,以便代码成功运行“?
我知道CoffeeScript已经修补了Node的模块加载器,因此除了.coffee
之外,它还可以加载.js
个文件。因此,如果我只知道如何,似乎也可能有某种方法来修补它以注入变量。
答案 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'},
});