これはそれのように見えます非常に単純である必要があります。しかし、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
を使用してエクスポートしますが、これらのアプローチのいずれかは、これらのオブジェクトが存在しない標準のブラウザー状況で、関数コードがエラーをスローすることを意味します。
では、ノード固有の構文を使用せずに、テストとは別のスクリプトファイルで宣言されているスタンドアロン関数にアクセスするにはどうすればよいですか?
_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 }
を実行します。
ここでの他の回答のおかげで、私はうまくいきました。
ただし、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);
})
})
})
Requireでモジュールを利用できるようにしたい場合は、
module.exports
あなたが知っているように ;)
Nodeおよびブラウザでこれを行うことでモジュールを使用する場合の解決策があります
function testFunction() { /* code */ }
if (typeof exports !== 'undefined') {
exports.testFunction = testFunction
}
これを行うことで、ブラウザやノード環境でファイルを使用できるようになります