48

これは非常に単純なはずです。しかし、2時間の読書と試行錯誤の結果、成功しなかったので、敗北を認め、皆さんに質問します!

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.

私が見つけたほとんどの例は、オブジェクトと関数を Nodeglobalオブジェクトにアタッチするか、または Node オブジェクトを使用してそれらをエクスポートするため、その理由はわかりmodule.exportsます。存在しません。

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

4

3 に答える 3

29

ここでの他の回答のおかげで、私はうまくいっています。

ただし、言及されていないことの 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);
        })
    })
})
于 2012-04-18T12:34:47.387 に答える
18
require('./functions.js')

あなたは何もエクスポートしていないので、それは何もしません。あなたが期待しているのは、それtestFunctionがグローバルに利用可能であり、本質的に

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

export/ globalsメカニズムをバイパスすることはできません。それがノードの設計方法です。暗黙的なグローバル共有コンテキストはありません (windowブラウザーのように)。モジュール内のすべての「グローバル」変数は、そのコンテキストにトラップされます。

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

于 2012-04-18T06:54:27.110 に答える
9

require を介してモジュールを利用可能にしたい場合は、使用する必要があります

module.exports

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

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

function testFunction() { /* code */ }

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

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

于 2012-04-18T06:55:13.720 に答える