2011-12-04 23 views
0

我想使用Vows來測試無DOM的JavaScript代碼,理想情況下直接針對編譯後的JS運行。 我的誓言是用CoffeeScript編寫的,但我不確定如何載入我的JS;我已經使用eval嘗試了它內聯:在Node.js下測試Closure編譯器輸出

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:氯沒有定義」。 在瀏覽器控制檯中運行縮小的JS和new Cl.LinearExpression(5);可以正常工作,因此編譯後的代碼沒問題。 將JS加載到節點進行Vows測試的最佳方式是什麼?

+0

您可以使用反引號將JS內聯,不要使用eval。 – thejh

回答

0

這是一個命名空間問題;與

codes = require "../out/compiled.js" 
for k,v of codes 
    global[k] = v 

進口將所有的編譯JS對象到當前的命名空間,在那裏他們可以在誓言進行訪問的。

不幸的是,我仍然不知道爲什麼使用eval()或帶有內嵌內容compiled.js的反引號不起作用。

0

您可以使用反向按原樣嵌入JavaScript。

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

我不知道這個,謝謝。這比eval()更好說,但我得到了同樣的錯誤。 –

2

而不是使用eval,爲什麼不使用節點的require?你可以指向一個.js.coffee文件中的相對目錄,像這樣:

Cl = require './cl.js' 

在該文件中,添加行

module.exports = Cl 

當文件require d,返回值require是模塊的exports

+0

我想避免必須在我編譯的JS中聲明'module.exports',因爲我不會將它作爲節點庫運行。儘管如此,我只是嘗試了一下,並且出現了「cl未定義」的錯誤,堆棧跟蹤顯示它來自「cl.js」。 Node看起來好像在評估JS的方式與Chrome不同。 –

+0

你也可以編寫'this.Cl = ...'(在最外層的範圍內)。這將在瀏覽器中創建一個名爲'Cl'的全局變量,並在Node中創建一個名爲'Cl'的導出。使用'{Cl} = require'。/ cl''從您的測試中訪問導出的對象。 –

+0

我並不是說在我的JS中的任何地方都有'Cl ='它正在被Google的Closure編譯器編譯(在進行高級優化時),並且有一些魔術正在進行,似乎在瀏覽器中工作,但在節點中不起作用。 –