テストするファイル(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」なしで単体テストを実行する方法はありますか?
これを行うには、インポートプロセス自体をオーバーライドする必要があります。同様のことを行うためのライブラリがあります-
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プラクティスについてどれほどハードコアにしたいのか、モック/スタブプロセスにどの程度の複雑さを導入するのかについてです。前者を緩和して後者を回避することを好みますが、最終的にはあなた次第です。