2011-12-04 7 views
0

私は、DOMフリーのJavaScriptコードをテストするために、誓いを使い、理想的にはコンパイル済みのJSに対して直接実行したいと考えています。 私の誓いはCoffeeScriptで書かれていますが、自分のJSを読み込む方法がわかりません。私はちょうどevalを使用して、それをインライン化しようとしました:ClosureのテストNode.jsでのコンパイラ出力

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とnew Cl.LinearExpression(5);を実行すると正常に動作するため、コンパイルされたコードは問題ありません。 誓約によるテストのためにJSをノードにロードする最良の方法は何ですか?

+0

backticksを使用してJSをインライン化することができます。これにはevalを使用しないでください。 – thejh

答えて

0

これは名前空間の問題です。

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

は、コンパイルされたすべてのJSオブジェクトを現在の名前空間に追加します。そこでは、Vowsでアクセスできます。

残念ながら、なぜeval()を使用するのか、インライン化された内容がcompiled.jsのバッククックが機能しないのはまだわかりません。

0

バックスティックを使用すると、JavaScriptをそのまま埋め込むことができます。

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

私はこれを知らなかった、ありがとう。これは 'eval()'よりもいいですが、同じエラーが出ます。 –

2

むしろevalを使用するよりも、なぜノードのrequireを使わないのでしょうか?あなたはそうのように、相対ディレクトリに.js.coffeeファイルのいずれかを指すことができます。

Cl = require './cl.js' 

をそのファイルには、ファイルがrequire D、の戻り値である場合にはライン

module.exports = Cl 

を追加しますrequireはモジュールのexportsです。

+0

コンパイル済みのJSで 'module.exports'を宣言しなくてもいいので、ノードライブラリとして実行することはありません。私はそれを試してみましたが、 "clは定義されていません"というエラーがスタックトレースに表示され、 "cl.js"から表示されます。それは、ノードがChromeとは何とか異なってJSを評価しているようです。 –

+0

'this.Cl = ...'(最も外側のスコープ内に)を書くこともできます。これにより、ブラウザーには「Cl」という名前のグローバルが作成され、ノードには「Cl」という名前のエクスポートが作成されます。あなたのテストからエクスポートされたオブジェクトにアクセスするには、 '{Cl} = require '。/ cl''を使用してください。 –

+0

私はJSのどこにいてもCl =を言っているわけではありません--- GoogleのClosureコンパイラ(高度な最適化機能を備えています)でコンパイルされており、ブラウザでは動作するようですがノードでは動作しないようです。 –

関連する問題