DataReader からリストを設定するメソッドをテストするにはどうすればよいですか?
-
09-06-2019 - |
質問
そのため、私は手動のデータベース操作に重点を置いたレガシー コードに取り組んでいます。ここではある程度の品質を維持したいので、できる限り TDD を使用します。
私が取り組んでいるコードにはデータを入力する必要があります。 List<Foo>
機能する Foo に必要なすべてのフィールドを返す DataReader から。ただし、コードが実際にデータベースの 1 行ごとに 1 つのリスト項目を返すことを確認したい場合は、次のようなテスト コードを作成します。
Expect.Call(reader.Read()).Return(true);
Expect.Call(reader["foo_id"]).Return((long) 1);
// ....
Expect.Call(reader.Read()).Return(true);
Expect.Call(reader["foo_id"]).Return((long) 2);
// ....
Expect.Call(reader.Read()).Return(false);
これはかなり面倒で、壊れやすいものでもあります。
結果が非常に混乱した脆性テストにならないようにするには、この問題にどのように対処すればよいでしょうか?
ところで、私は現在これに Rhino.Mocks を使用していますが、結果が十分に納得できるものであれば、変更することができます。代替手段が TypeMock ではない限り、最後に確認した EULA は私の好みには少し怖すぎたので。
編集:また、現在は C# 2 に限定されています。
解決
これを面倒にしないようにするには、DataReader とリストに保持するオブジェクトの間のマッピングをカプセル化/リファクタリングする必要があります。そのロジックをカプセル化する手順はかなり少ないです。それがあなたが進みたい道であれば、私がコードを投稿します。このコードを StackOverflow に投稿することがどれほど実用的かはわかりませんが、簡潔かつ要点を保つために試してみることはできます。そうしないと、リーダーのインデックス アクセサーに対してそれぞれの期待を繰り返すという退屈な作業に追われることになります。カプセル化プロセスでは文字列も削除され、テストを通じてそれらの文字列がより再利用しやすくなります。
また、既存のコードをどの程度テストしやすくしたいのか、現時点ではわかりません。これは、テストを念頭に置いて構築されていないレガシー コードであるためです。
他のヒント
コードを投稿しようと考えていたとき、JP Boodhoo の Nothin But .NET コースのことを思い出しました。彼が持っています サンプルプロジェクト 彼は授業中に作成したものを共有しているとのこと。プロジェクトがホストされているのは、 Googleコード そしてそれは素晴らしいリソースです。マッピングをリファクタリングする方法についてのアイデアを提供し、使用するための素晴らしいヒントがいくつか含まれていると確信しています。プロジェクト全体は TDD で構築されました。
Foo インスタンスをリストに入れて、オブジェクトを読み取ったものと比較できます。
var arrFoos = new Foos[]{...}; // what you expect
var expectedFoos = new List<Foo>(arrFoos); // make a list from the hardcoded array of expected Foos
var readerResult = ReadEntireList(reader); // read everything from reader and put in List<Foo>
Expect.ContainSameFoos(expectedFoos, readerResult); // compare the two lists
ココス、
いくつか間違った点があります。まず、そのようにするということは、最初に Foos を構築し、次にその値を何もしないモック リーダーにフィードする必要があることを意味します。 減らす 私が書いているコードの量。次に、値がリーダーを通過する場合、Foos は 同じ Foos (参照の等価性)。彼らはそうかもしれない 等しい, 、しかし、これでも Foo クラスをあまりにも多く想定しているので、現時点ではあえて触れません。
明確にしておきますが、SQL Server への呼び出しをテストしてデータが返されるようにしたい、またはデータがあればそれをモデルにマップし直すことができるようにしたいと考えていますか?
SQL への呼び出しをテストしたい場合は、返されたデータを確認してください。私の答えが見つかりました ここ
@トラン:私がテストしているのは、データベースから返されたデータから引用/引用解除ドメイン モデルへのプログラムによるマッピングです。したがって、データベース接続を模擬したいと思います。他の種類のテストの場合は、全面的な統合テストを行うと思います。
@デール:あなたはそこをかなりうまくやっていたと思います、そして私はそうかもしれないと心配していました。誰かが汚い仕事をして、それをより理解しやすいステップに分解した記事などへのポインタがある場合は、感謝します。コードサンプルも役に立ちます。その問題に対処する方法については手掛かりはありますが、実際にそれを実行する前に、他のことを行う必要があります。テストに退屈なモックが必要な場合は、それを実行します。