私たちはほとんどのビジネス ロジックの単体テストを行っていますが、大規模なサービス タスクとインポート/エクスポート ルーチンのいくつかをテストする最善の方法に行き詰まっています。たとえば、あるシステムからサードパーティ システムへの給与データのエクスポートを考えてみましょう。会社が必要とする形式でデータをエクスポートするには、最大 40 個のテーブルにヒットする必要があり、テスト データを作成して依存関係をモックアウトするという悪夢のような状況が発生します。
たとえば、次のことを考えてみましょう (約 3500 行のエクスポート コードのサブセット)。
public void ExportPaychecks()
{
var pays = _pays.GetPaysForCurrentDate();
foreach (PayObject pay in pays)
{
WriteHeaderRow(pay);
if (pay.IsFirstCheck)
{
WriteDetailRowType1(pay);
}
}
}
private void WriteHeaderRow(PayObject pay)
{
//do lots more stuff
}
private void WriteDetailRowType1(PayObject pay)
{
//do lots more stuff
}
この特定のエクスポート クラスには、ExportPaychecks() というパブリック メソッドしかありません。これは、このクラスを呼び出す人にとって本当に意味のある唯一のアクションです...他のすべてはプライベートです(〜80のプライベート関数)。テストのためにそれらを公開することもできますが、それぞれを個別にテストするためにそれらをモックする必要があります (つまり、WriteHeaderRow 関数をモックしないと、ExportPaychecks を単独でテストすることはできません。これも大きな苦痛です。
これは単一のベンダーの単一のエクスポートであるため、ロジックをドメインに移動することは意味がありません。ロジックは、この特定のクラスの外ではドメインの意味を持ちません。テストとして、100% に近いコード カバレッジを持つ単体テストを構築しました ... しかし、これには、スタブ/モック オブジェクトに入力された非常に多くのテスト データに加えて、多くの依存関係をスタブ/モック化するために 7000 行を超えるコードが必要でした.
HRIS ソフトウェアのメーカーとして、何百もの輸出入を行っています。他の会社は本当にこの種の単体テストを行っていますか? もしそうなら、痛みを軽減する近道はありますか? 私は、「インポート/エクスポート ルーチンのユニット テストは行わない」と言って、後で統合テストを実装するだけの誘惑にかられます。
更新- すべての回答に感謝します。コードを混乱させることなく、大きなファイルのエクスポートのようなものを簡単にテスト可能なコードのブロックに変換する方法をまだ見ていないので、私が見たいのは例です。