2017-01-23 20 views
1

Jestをよく見ていますが、多くの良いレポートが得られています。しかし、アクセス内部関数をテストするための良い方法を見つけるのには苦労しています。だから、Jestを使用して内部関数を取得する

私が持っている場合:

const Add2 = (n)=> n+2; 

export default (list)=>{ 
    return list.map(Add2()); 
} 

その後、私は私はこのような内部ADD2機能を得るために、再配線やバベル - プラグインのReWireを使用すると思いジャスミンやモカを使用していた場合:

var rewire = require('rewire'); 
var Add2 = rewire('./Adder').__get__('Add2'); 

it('Should add 2 to number',()=>{ 
    let val = Add2(1); 
    expect(val).toEqual(3); 
}); 

しかし、それらのどちらも冗談では動作しないようですが、優れた嘲笑構文のように見えますが、私は内部的な機能を得る方法がありません。

これを行うには良い方法がありますか、私は冗談APIに設定していないか、設定していますか?

答えて

0

各テストの前にバーベルを使用してファイルを変換する場合は、実際にこれを達成できます。ここでは何をする必要があるのですか(私はバーベル自体を起動して実行する方法を知っていると思いますが、複数のチュートリアルは利用できません):

まず、babel-jest pluginをjestに、babel-plugin-rewireバーベル用:

npm install --save-dev babel-jest babel-plugin-rewire 

次に、ルートディレクトリに.babelrcファイルを追加する必要があります。

{ 
    "plugin": ["rewire"] 
} 

これは、次のようにする必要があります(正しく設定されていると仮定します)。 babel-jestは自動的に.babelrcを受け取るので、他の変換が既に行われていない限り、そこに追加の設定は必要ありません。 Babelはjestがそれらを実行する前にすべてのファイルを変換し、speedskaterのrewireプラグインはrewire APIを介してモジュールの内部を公開します。

+0

ええと、これを実装しようとしましたが、うまくいきませんでした.Jasmineで使用しています。私はそれについていくつかの調査を行い、これを発見しました - https://github.com/facebook/jest/issues/1003。あなたはこれが働いているのですか?私は行方不明のものがありますか? –

+0

はい、この設定が有効です。あなたが欠けていることを言うのは難しいです。どこかで時間を見つけたら、サンプルプロジェクトをセットアップしようとしますが、約束はありません。それが失敗した場所を示すために同じことをすることができれば、おそらく問題が何であるか一緒に考え出すことができますか? –

+0

よくお会いします。私が何かを見逃しているかどうか見てみましょう。あなたが素晴らしいプロジェクトの例を手に入れたら、 –

-2

jestではこれができません。また、モジュールの内部をテストするのではなく、パブリックAPIだけをテストして、他のモジュールが消費するものであるようにしてください。彼らはyourModule([1,2,3])[3,4,5]を返す限り、Add2がどのように実装されているか気にしません。

+2

私は内部機能のテストについて理解していますが、個人的には、安定したコードベースで内部の一部をテストするほうが良いとわかりました。私はこのブログ記事が私の気持ちをまとめていると思う - https://philipwalton.com/articles/whyi-i-test-private-functions-in-javascript/。面白いことに、あなたは冗談が私のために正しいかどうかを検討する必要があるかもしれないという選択肢がない。 –

+0

もちろん、内部機能をテストする必要があります。 –

+0

エクスポートされていないモジュール内の関数は、ハックの束なしで外部から到達できません。また、このハックは、実際のモジュールをもうテストしないことを意味します。だから、あなたが本当に重要ないくつかの方法を持っていれば、それらをutilsモジュールに入れてそこでテストしてください。 –

0

私はしばらくこの問題に苦労していましたが、問題はJestに固有のものではないと思います。

私はそれが理想的ではないと知っているが、多くの状況で、私は実際にちょうどちょうどテストの目的のために、内部関数をエクスポートすることを決めた:

export const Add2 = x => x + 2; 

は以前、私が私のコードを変更する考えを嫌いますテストを可能にする/簡単にするためです。これは、これがハードウェア設計における重要なプラクティスであることを学ぶまでのことでした。設計しているハードウェアに特定の接続ポイントを追加するだけで、正しく動作するかどうかをテストできます。彼らはのデザインを変更して、のテストを容易にします。

はい、これは完全に再配線のようなもので行うことができます。私の意見では、このようなツールで導入する追加の複雑さ(そして精神的なオーバーヘッド)は、「より正確な」コードを持っていることの恩恵に値するものではありません。

これはトレードオフです。私はテストとシンプルさを重視しています。私にとっては、テスト目的でプライベート関数をエクスポートしても問題ありません。

関連する問題