これは私の問題の核心を説明する簡単な例です:
var innerLib = require('./path/to/innerLib');
function underTest() {
return innerLib.doComplexStuff();
}
module.exports = underTest;
このコードの単体テストを記述しようとしています。関数を完全にモックアウトinnerLib
せずに、の要件をモックアウトするにはどうすればよいrequire
ですか?
だから私はグローバルをモックアウトしようとrequire
していて、それをやってもうまくいかないことを見つけようとしています:
var path = require('path'),
vm = require('vm'),
fs = require('fs'),
indexPath = path.join(__dirname, './underTest');
var globalRequire = require;
require = function(name) {
console.log('require: ' + name);
switch(name) {
case 'connect':
case indexPath:
return globalRequire(name);
break;
}
};
問題はrequire
、underTest.js
ファイル内の関数が実際にモックアウトされていないことです。それはまだグローバルrequire
関数を指しています。したがってrequire
、モックインしているのと同じファイル内でのみ関数をモックアウトできるようです。require
ローカルコピーをオーバーライドした後でも、グローバルを使用して何かを含める場合は、必要なファイルにはまだグローバルrequire
参照。
global.require
。module
モジュールはモジュールスコープなので、変数はデフォルトで書き込まれます。