Unit testing 我可以在节点模块';有子弹吗?

Unit testing 我可以在节点模块';有子弹吗?,unit-testing,node.js,knockout.js,Unit Testing,Node.js,Knockout.js,我正在编写一个面向浏览器的应用程序,我想为我的库代码编写自动测试。我希望在浏览器之外的命令行环境中运行这些测试,如。我还没有选择测试框架,尽管我倾向于像or这样的BDD框架 我的代码依赖于的可观察属性。不幸的是,Knockout库不仅包含可观察的属性,还包含将它们绑定到DOM的代码。因此,如果我只是尝试require()。Knockout实际上并不经常使用这些变量中的任何一个——它主要只是DOM绑定的一点特性检测,这对我来说并不重要——但因为它确实使用了这些变量,Node甚至不会加载文件 因此,

我正在编写一个面向浏览器的应用程序,我想为我的库代码编写自动测试。我希望在浏览器之外的命令行环境中运行这些测试,如。我还没有选择测试框架,尽管我倾向于像or这样的BDD框架

我的代码依赖于的可观察属性。不幸的是,Knockout库不仅包含可观察的属性,还包含将它们绑定到DOM的代码。因此,如果我只是尝试
require()。Knockout实际上并不经常使用这些变量中的任何一个——它主要只是DOM绑定的一点特性检测,这对我来说并不重要——但因为它确实使用了这些变量,Node甚至不会加载文件

因此,我的问题是:我可以在加载模块时向模块中注入虚拟变量吗?我可以说“在加载源文件之后,但在开始运行之前,让我在模块中设置一些变量,以便代码能够成功运行”吗

我知道已经对节点的模块加载器进行了补丁,这样它就可以加载
.coffee
文件以及
.js
;所以,如果我知道怎么做的话,似乎也有办法修补它来注入变量。

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

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

Node.js不是一个“无头”环境,因为它是常用的(无头浏览器)


jsdom可以让您走得更远,但您应该研究一下,它是无头webkit,具有DOM和all,并且应该完全适合您的用例。

也许可以使用felixge的节点,对敲除库进行沙箱处理,并将全局变量注入沙箱模块中

自述文件:

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

哦!你说得对,在JavaScript中,我只需要做
window={}在我在敲除时调用
require()
之前。但我使用的是CoffeeScript,默认情况下,它将所有内容都封装在一个匿名函数中,这样全局对象就不会在所有内容上流血,因此我必须设置
global.window
。一旦我知道有东西要找,就不难找到了——谢谢你给我指明了正确的方向。(感谢您指出jsdom——这可能对我也有帮助!)我已经看了一些PhantomJS,但它的测试运行程序支持似乎很笨拙(DOM抓取),而且由于测试由
标记引用,所以没有很好的方法用CoffeeScript编写测试。所以我想深入研究节点,看看它是如何堆积起来的。谢谢你对术语的更正。我编辑了我的帖子,删除了“headless”这个词,因为它的意思和我想象的不一样。coffeescript在Phantom中运行良好,使用
方法,您还可以在运行之前编译文件。你说的DOM刮片是什么意思?这就像在浏览器上运行测试套件一样,您使用了外部脚本(