私はいくつかのモジュール ( DZP::CatalystとDZP::OurPkgVersion ) を持っていますが、どちらもファイルをディスクに書き出すことを目的としています。それらをテストする方法がわかりません。ディスクに書き出されたファイルをテストするための良い戦略はありますか? それを読むために私が行くことができる場所はありますか?
2 に答える
モジュールによって多少異なりますが、私の一般的な戦略は次のとおりです。
ファイル コンテンツ ロジックが、異なる方法である限り、ファイル メカニクス (ディレクトリの選択/ファイルを開く/ファイルを閉じる/エラー処理など) から 100% 分離されていることを確認します。
ファイルの仕組みが 100% 柔軟であることを確認してください。たとえば、外部ドライバーからディレクトリ/ファイル名を選択できます。
指定されたディレクトリで指定されたファイルを開き、閉じて、エラーが発生しないこと、および期待されるファイルが存在し、サイズがゼロであることを確認するだけで、ファイルの仕組みのテストを作成します。
配列の各要素が 3 つの部分で構成される、テスト データの配列を作成する
ファイル コンテンツ ロジックの入力データ。必要に応じてファイル コンテンツ ロジックのどのメソッドをそのデータに対して呼び出すかを示すテスト構成と組み合わせることができます。
期待されるファイル名が設定される
予想されるファイルの内容。tar ボール化された予想されるファイル (生成される正確な予想されるコンテンツと正しい予想される名前を含む正確なファイル) の形式です。
期待される結果の tarball は、別のサブディレクトリ (テスト スクリプトが存在するディレクトリの下の「expected_results」など) にある必要があります。
ファイル生成ロジックで複数のファイルが生成される場合は、tarball が必要です。
次に、前に作成したテスト配列の各テストに対してループを実行します。
新しい「実際の結果」の一時ディレクトリを作成します(または以前のテストからのものをクリーンアップします)
モジュールのディレクトリを一時ディレクトリに設定します。モジュールのファイル名をテスト情報からの予想されるファイル名に設定します。
ファイルオープナーメソッドを実行します(以前にテスト済み)
テストのロジック指示 (該当する場合) とテストの入力データを使用して、モジュールからコンテンツ生成ロジックを実行します。
ファイルクローザーメソッドを実行します(以前にテスト済み)
「一時的に期待される結果」の一時ディレクトリを作成します(または最後のテストからのものをクリーンアップします)
「expected_results」テスト サブディレクトリから「expected_results」tarball を、最後の箇条書きで作成した「temp expected results」一時ディレクトリにコピーします。
その tarball を「temp expected results」一時ディレクトリに untar し、そこから tarball を削除します。
directory-diff は、「期待される一時的な結果」の一時ディレクトリと「実際の結果」の一時ディレクトリを比較します (たとえば、両方のファイルのリストが 100% 同一であり、各ファイルの内容がネイティブ Perl または
diff
viasystem()
呼び出しを使用して 100% 同じであることを確認します)。
上記のロジックは非常に一般的であるため、通常、ファイル生成機能をテストするすべてのユニット テストと統合テストで再利用される "Test::FileGenerator" モジュールにそのほとんどを抽象化します。
さて、この特定のケース ( Dist::Zillaプラグイン) では、 Dist::Zilla::Testerを使用したいと思うでしょう。一時ディレクトリを作成し、そこにファイルを追加し、その後クリーンアップするという単調な作業の多くを処理します。たとえば、私の DZP::CJM からのテスト、またはDist::Zilla 自体からのテスト、特にplugins ディレクトリを参照してください。
更新: Dist::Zilla 4.200002 はTest::DZilモジュールを導入しました。これは、プラグインのテストに役立ついくつかのユーティリティ関数を追加します。Dist::Zilla::Tester を直接使用する代わりに、おそらくそれを使用したいと思うでしょう。