2012-04-18 8 views
44

これはそのように思えますshould非常に単純です。しかし、2時間の読書と試行錯誤が成功しなければ、私は敗北を認め、皆さんに尋ねています!Mochaで「ノーノード」のJavaScript関数をテストするにはどうすればよいですか?

私はMochaShould.jsを使用していくつかのJavaScript関数をテストしようとしていますが、スコープの問題に取り組んでいます。私はそれをテストケースの最も基本的なものに単純化しましたが、それを動作させることはできません。

私は次のものが含まれていfunctions.jsという名前のファイルを、持っている:

function testFunction() { 
    return 1; 
} 

そして、私のtests.js(同じフォルダにあります)内容:

require('./functions.js') 

describe('tests', function(){ 
    describe('testFunction', function(){ 
     it('should return 1', function(){ 
      testFunction().should.equal(1); 
     }) 
    }) 
}) 

このテストでは、ReferenceError: testFunction is not definedで失敗します。

私はどちらかのノードglobalオブジェクトにオブジェクトや関数を添付したり、これらのアプローチのいずれかを使用してブタ彼らはmodule.exportsを使用してエクスポート見​​つけた例のほとんどは、私の機能コードは、標準のエラーを投げるだろう意味するので、なぜ、私が見ることができますこれらのオブジェクトが存在しないブラウザの状況。

したがって、ノード固有の構文を使用せずに、テストとは別のスクリプトファイルで宣言されたスタンドアロン関数にアクセスするにはどうすればよいですか?

+0

あなたに 'exports.testFunction = testFunction'を使用しましたが、 functions.js? – drinchev

+4

いいえ、 'functions.js'の内容がすべて表示されます。質問をもう一度読んでください。ソースファイルでノード固有の構文を使用したくないと具体的に述べています。 –

答えて

15
require('./functions.js') 

何もエクスポートしていないので、何もしません。何を期待していることtestFunctionはあなただけエクスポート/グローバル・メカニズムをバイパスすることはできません

global.testFunction = function() { 
    return 1; 
} 

と本質的に同じ、世界的に利用可能であるということです。それはノードが設計された方法です。暗黙のグローバル共有コンテキストはありません(ブラウザにwindowなど)。モジュール内のすべての「グローバル」変数は、そのコンテキスト内にトラップされます。

module.exportsを使用してください。そのファイルをブラウザ環境と共有しようとする場合、互換性を持たせる方法があります。クイックハックを行うには、ブラウザにwindow.module = {}; jQuery.extend(window, module.exports)、ノードにはif (typeof exports !== 'undefined'){ exports.testFunction = testFunction }を実行してください。

+3

それは感謝します、ありがとう。だからモカは実際に非ノードJSのテストを意図していないのですか?私が遭遇したドキュメントやチュートリアルのどこにでも言及していません。 –

+0

ブラウザでテストするにはQunit(http://docs.jquery.com/Qunit)、mochaでブラウザ環境をシミュレートするにはzombie.js(https://github.com/assaf/zombie)を試してみてください。 – drinchev

+0

@MarkBell Mochaはブラウザでうまく動作するはずです。この場合、 'exports'は必要ありません。 –

6

あなたが任意のモジュールを利用できるようにしたい場合を通じて、あなたが知っているようにあなたが

module.exports 

を使用する必要があります必要とします。)

あなたがでノードに、ブラウザでモジュールを使用したい場合は解決策がありますこれを実行することにより、この

function testFunction() { /* code */ } 

if (typeof exports !== 'undefined') { 
    exports.testFunction = testFunction 
} 

を行うと、あなたは、ブラウザで、ノード環境でファイルを使用できるようになります

+0

ありがとう、それは便利です。 –

24

他の回答に感謝します。

Nodersの共通知識のために言及されていなかったことの1つは、require呼び出しの結果を変数に代入する必要があったためです。エクスポートされた関数を呼び出す際に参照することができます。テストスイート内で

ここで今後の参考のために私の完全なコード、です:

functions.js

function testFunction() { 
    return 1; 
} 

// If we're running under Node, 
if(typeof exports !== 'undefined') { 
    exports.testFunction = testFunction; 
} 

tests.js

var myCode = require('./functions') 

describe('tests', function(){ 
    describe('testFunction', function(){ 
     it('should return 1', function(){ 
      // Call the exported function from the module 
      myCode.testFunction().should.equal(1); 
     }) 
    }) 
}) 
関連する問題