5

だから私は手動のデータベース操作に重いいくつかのレガシーコードに取り組んでいます。ここでは品質の類似性を維持しようとしているので、可能な限り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に制限されています。

4

6 に答える 6

1

コードを投稿しようと思ったときに、JP Boodhoo の Nothin But .NET コースを思い出しました。彼は、クラスの 1 つで作成されたサンプル プロジェクトを共有しています。このプロジェクトはGoogle Codeでホストされており、優れたリソースです。マッピングをリファクタリングする方法についてのアイデアを提供し、使用するためのいくつかの素晴らしいヒントがあると確信しています。プロジェクト全体がTDDで構築されました。

于 2008-08-27T18:42:09.133 に答える
1

これを簡単にするために、リストに保持する DataReader とオブジェクトの間のマッピングをカプセル化/リファクタリングする必要があります。そのロジックをカプセル化するための手順はほとんどありません。それがあなたがたどりたい道なら、コードを投稿できます。コードをここ StackOverflow に投稿することがどれほど実用的かはわかりませんが、簡潔で要点を保つために試してみることはできます。そうしないと、リーダーのインデックス アクセサーでそれぞれの期待値を繰り返すという面倒な作業に行き詰まります。カプセル化プロセスでは、文字列も削除され、テストを通じてそれらの文字列がより再利用可能になります。

また、この時点では、既存のコードをどれだけテストしやすくしたいのかわかりません。これは、テストを念頭に置いて構築されていないレガシー コードであるためです。

于 2008-08-27T17:22:46.140 に答える
0

@Toran:私がテストしているのは、データベースから返されたデータから引用符なしのドメインモデルへのプログラムによるマッピングです。したがって、データベース接続をモックアウトしたいと思います。他の種類のテストについては、私は全面的な統合テストに行きます。

@デール:あなたはそれをかなりうまく釘付けにしたと思います、そして私はそれが事実かもしれないのではないかと心配しました。誰かが汚い仕事をして、それをより簡単に消化できるステップに分解した記事などへのポインタを持っているなら、私はそれをいただければ幸いです。コードサンプルも害はありません。私はその問題にどのように取り組むかについての手がかりを持っていますが、実際にそれを行う前に、他のことを行う必要があります。それをテストするのに面倒なモックが必要な場合は、それを行います。

于 2008-08-27T18:01:49.917 に答える
0

ココス、

いくつか間違っています。まず、そのようにするということは、最初に Foos を作成してから、それらの値をモック リーダーにフィードする必要があることを意味します。次に、値がリーダーを通過する場合、Foos は同じFoos にはなりません (参照の等価性)。それらはequalかもしれませんが、それでも Foo クラスが多すぎると想定しているため、現時点ではあえて触れません。

于 2008-08-27T17:00:00.517 に答える
0

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
于 2008-08-27T13:15:01.353 に答える
0

明確にするために、SQL Server への呼び出しをテストしてデータが返されるようにしたいですか、それともデータがある場合はそれをモデルにマップし直すことができますか?

SQLへの呼び出しをテストしたい場合は、いくつかのデータチェックアウトが返されました。私の答えはここにあります

于 2008-08-27T17:42:35.673 に答える