bugfix> node.js > 投稿

テストするファイル(source.js)があるとします:

// source.js
import x from './x';
export default () => x();

そして、単体テストコードは非常に簡単です。

// test.js
import test from 'ava';
import source from './source'
test("OK", t => {
  source();
  t.pass();
});

しかし、これは難しいことです。ファイル "./x"はテスト環境に存在しません。単体テストなので、「./ x」は必要ありません。とにかく関数 "x()"をモックできます(sinonなどを使用)。しかし、ユニットテストツールavaは、「エラー:モジュール './x'が見つかりません」と表示し続けます。

ファイル「./x」なしで単体テストを実行する方法はありますか?

回答 1 件
  • これを行うには、インポートプロセス自体をオーバーライドする必要があります。同様のことを行うためのライブラリがあります- require をオーバーライドする  たとえば、proxyquireを使用した関数です。ただし、これらはカスタム関数を呼び出して、テスト中のモジュールをインポートするように強制します。つまり、ES6モジュールの構文を使用するのをやめる必要があります。

    また、ESモジュールはNodeで実験的に(そして比較的最近)サポートされているだけであることに注意してください。 Babelでトランスパイルしている場合は、実際に ESモジュールを使用します。確かに構文を使用していますが、BabelはそれらをCommonJSの「同等物」に変換し、 require を完備しています  呼び出しと module.exports  割り当て。

    そのため、Babelを使用している場合は、おそらく proxyquire  それらのモジュールでESモジュール構文を使用している場合でも、テスト中のモジュールをテストファイルにインポートします。ただし、バベルから切り替えた場合、これは壊れます。 :\

    私が個人的に推奨することは、スタブする必要があるかもしれないものを直接エクスポートしないことです。したがって、 x のような機能   import foo from './foo' のようにインポートされた静的モジュール内にある必要があります   foo.x() のように呼び出されます 。その後、 sinon.stub(foo, 'x') で簡単にスタブできます 。もちろん、 './foo'  ファイルはこのためにまだ存在している必要がありますが、実際には、TDDプラクティスについてどれほどハードコアにしたいのか、モック/スタブプロセスにどの程度の複雑さを導入するのかについてです。前者を緩和して後者を回避することを好みますが、最終的にはあなた次第です。

あなたの答え