在Node.js下测试闭包编译器输出

在Node.js下测试闭包编译器输出,node.js,coffeescript,google-closure-compiler,vows,Node.js,Coffeescript,Google Closure Compiler,Vows,我想使用Vows来测试无DOM的JavaScript代码,理想的情况是直接针对已编译的JS运行。 我的誓言是用咖啡脚本写的,但我不知道如何加载我的JS;我尝试使用eval内联它: vows = require "vows" assert = require "assert" eval('var e=this;function f(a,g){var c=a.split("."),b=e;!(c[0]in b)&&b.execScript&&b.execScript(

我想使用Vows来测试无DOM的JavaScript代码,理想的情况是直接针对已编译的JS运行。 我的誓言是用咖啡脚本写的,但我不知道如何加载我的JS;我尝试使用
eval
内联它:

vows = require "vows"
assert = require "assert"
eval('var e=this;function f(a,g){var c=a.split("."),b=e;!(c[0]in b)&&b.execScript&&b.execScript("var "+c[0]);for(var d;c.length&&(d=c.shift());)!c.length&&g!==void 0?b[d]=g:b=b[d]?b[d]:b[d]={}}function h(a){a.call(e)};(function(){var a;a={};h(function(){a=function(a){this.a=a};a.prototype.b=function(a){return this.a+a.a};f("Cl.LinearExpression",a);f("Cl.LinearExpression.prototype.plus",a.prototype.b)})}).call(this);');

vows
  .describe("Linear Expression")
  .addBatch
    "initialized with a number":
      topic: -> new Cl.LinearExpression 5

      "adds up with scalar": (cle) -> assert.equal 7, cle.plus 2

  .export(module)
但我得到“ReferenceError:Cl未定义”。 运行缩小的JS和新的Cl.LinearExpression(5)工作正常,因此编译后的代码没有问题。
将JS加载到节点中以进行Vows测试的最佳方法是什么?

您可以使用backtick按原样嵌入javascript

`var e=this;function f(a,g){ ... `

与其使用
eval
,为什么不使用节点的
require
?您可以指向相对目录中的
.js
.coffee
文件,如下所示:

Cl = require './cl.js'
在该文件中,添加行

module.exports = Cl

当文件为
require
d时,
require
的返回值是模块的
导出
这是一个命名空间问题;进口

codes = require "../out/compiled.js"
for k,v of codes
  global[k] = v
将所有已编译的JS对象添加到当前名称空间中,在该名称空间中可以通过Vows访问这些对象


不幸的是,我仍然不知道为什么对
compiled.js
的内联内容使用
eval()
或backticks不起作用。

可以使用backticks内联js,但不要使用eval。我希望避免在我编译的js中声明
module.exports
,因为我不会将其作为节点库运行。我只是尝试了一下,但是我得到了错误“Cl未定义”,stacktrace显示它来自“Cl.js”。Node对JS的评估似乎与Chrome有所不同。您还可以编写
this.Cl=…
(在最外层的范围内)。这将在浏览器中创建名为
Cl
的全局文件,并在节点中创建名为
Cl
的导出文件。使用
{Cl}=require./Cl'
访问测试中导出的对象。我不是说我的JS中的任何地方都有
Cl=
——它是由Google的闭包编译器编译的(启用了高级优化)一些魔法似乎在浏览器中起作用,但在节点中不起作用。那么,您可能希望在浏览器环境中进行测试。如果使用,可以从命令行运行浏览器测试。我不知道这一点,谢谢。这比
eval()
更好,但我得到了同样的错误。