1. ホーム
  2. javascript

[解決済み] 他のモジュールを必要とするNode.jsモジュールをユニットテストする方法と、グローバルなrequire関数をモックする方法は?

2022-04-22 16:14:19

質問

これは、私の問題の核心を説明する些細な例です。

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 を参照します。

解決方法は?

今すぐできる!

を公開しました。 代理照会 これは、テスト中にモジュール内でグローバルな require をオーバーライドするのを引き受けてくれるものです。

つまり コードに変更はありません を使用することで、必要なモジュールのモックをインジェクトすることができます。

Proxyquireは非常にシンプルなAPIを持っており、テストしようとするモジュールを解決し、必要なモジュールのモックやスタブを1つのステップで渡すことができるようになっています。

Raynosの言う通り、従来はそれを実現するためにあまり理想的とは言えない解決策に頼るか、代わりにボトムアップの開発を行う必要があった。

これが、私がproxyquireを作った主な理由です。トップダウンのテスト駆動開発を手間なく行えるようにするためです。

ドキュメントとサンプルを見て、自分のニーズに合うかどうかを判断してください。