[解決済み] 他のモジュールを必要とするNode.jsモジュールをユニットテストする方法と、グローバルなrequire関数をモックする方法は?
質問
これは、私の問題の核心を説明する些細な例です。
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を作った主な理由です。トップダウンのテスト駆動開発を手間なく行えるようにするためです。
ドキュメントとサンプルを見て、自分のニーズに合うかどうかを判断してください。
関連
-
vueのプロジェクトでモックを使用する方法を知っていますか?
-
Vueのフィルタの説明
-
[解決済み】awaitは非同期関数でのみ有効です。
-
[解決済み] Web API エラー - このリクエストはブロックされました; コンテンツは HTTPS で提供されなければなりません
-
Uncaught TypeError: null のプロパティ 'offsetHeight' を読み取れませんでした。
-
JavaScriptのgetElementById、getElementsByTagNam、getElementsByClassNameの違いと使い方
-
[解決済み] Node.jsのmodule.exportsの目的と使い方を教えてください。
-
[解決済み] ローカルのテキストファイルを読み込むには?
-
[解決済み】リクエストとレスポンスをモック化する方法は?
-
[解決済み] Exceptionを発生させる関数をモックしてexceptブロックをテストする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
親子コンポーネント通信を解決する3つのVueスロット
-
vue3.0プロジェクトのアーキテクチャを構築するための便利なツール
-
JavaScriptのクロージャの説明
-
Vueのクラススタイルの使い方の詳細
-
[解決済み】SyntaxError: JSONの位置1に予期しないトークンoがある。
-
[解決済み】JavaScriptエラー(Uncaught SyntaxError: Unexpected end of input)
-
[解決済み】React-Redux: アクションはプレーンオブジェクトでなければならない。非同期アクションにはカスタムミドルウェアを使用する
-
[解決済み】リクエストに失敗していないのに、「TypeError: failed to fetch」が表示される。
-
HTML5 LocalStorage ローカルストレージとセッションストレージの使用法
-
jq は html ページとデータを動的に分割する。