web-dev-qa-db-ja.com

「ノーマル」(ノード固有ではない)JavaScript関数をMochaでテストするにはどうすればよいですか?

これはそれのように見えます非常に単純である必要があります。しかし、2時間の読書と試行錯誤の後で成功しなかった後、私は敗北を認め、皆さんにお願いします!

Schauld.js とともに Mocha を使用して一部の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で失敗します。

私が見つけたほとんどの例では、オブジェクトと関数をNode globalオブジェクトにアタッチするか、module.exportsを使用してエクスポートしますが、これらのアプローチのいずれかは、これらのオブジェクトが存在しない標準のブラウザー状況で、関数コードがエラーをスローすることを意味します。

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

48
Mark Bell
_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 }を実行します。

17
Ricardo Tomasi

ここでの他の回答のおかげで、私はうまくいきました。

ただし、Noderの間で一般的な知識であるためか、言​​及されていないことの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);
        })
    })
})
26
Mark Bell

Requireでモジュールを利用できるようにしたい場合は、

module.exports

あなたが知っているように ;)

Nodeおよびブラウザでこれを行うことでモジュールを使用する場合の解決策があります

function testFunction() { /* code */ }

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

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

6
drinchev