2016-08-03 6 views
0

私はmoqを使ってC#コードをテストしています。テストされたメソッドには引数としてIDataReaderが渡されます。私はMockを使って、各フィールドのキーと値を設定してデータリーダーをモックしました(redare.Setup(x => x ["fieldName"])。しかし、テストされたメソッドで呼び出されるメソッドもあります。読者が読んでいるフィールドが存在する場合、呼び出されたメソッドはテストしています。私は嘲笑されたリーダーがMocked reader.Objectを使ってIDataReaderにキャストされたときに、カウントされたフィールドがないことを発見しました。誰でも私にフィールドカウント/フィールド名を設定する方法を教えてもらえますか?どうもありがとう!モックを作る方法<IDataReader>にはフィールドカウントがありますか?

更新: 私はこの問題を解決するためにこの記事を使用しました。すべての応答ありがとう。 How to mock IDataReader to test method which converts SqlDataReader to System.DataView

+0

あなたのテストとコードを投稿してください(同様にフォーマットされています) –

+1

これを実証するためにリンクした投稿。 'dataReaderMock.Setup(x => x.FieldCount).Returns(2);'。それはあなたがやろうとしていることではありませんか?また、 'IDataReader'のより機能的なモックが必要な場合は、独自の実装を記述する必要があるかもしれないことを示唆しています。私はもっ​​と情報が必要だと思う。私がテストしているコードがフィールドカウントを必要としているとは思えません。他のすべてが難しいです。私はどこかの誰かがこれに対して良いジェネリックなモックを書いていると思う。 –

答えて

0

私が今までに読んだことのあることは、機能的疑似体を作成することは少なくともテストしているコードほど複雑なことでしょう。

単体テストではなく、統合テストを書くことをお勧めします。私は通常、自分の開発プロジェクトにいくつかのヘルパーメソッドを用意していますので、開発データベースに期待しているレコードを挿入して、テストが返すものを正確に知ることができます。テストを実行した後、私はテストデータをクリアします。

This blog postは、さらに詳細に説明しています。

私はデータベースと私のストアドプロシージャをテストしているので、私はそれをモック以上のものと信じています。単体テストほど粒状ではありませんが、同じ目的を果たします。ストアドプロシージャーまたはそこから読み取るコードに欠陥がある場合は、それらを簡単に見つけて修正するつもりです。

いくつかの操作統合テストでは、両方を行うことができない限り、単体テストよりも実用的であるといういくつかの推奨事項を読んだことがあります。 を嘲笑するために見たコードはすべて非常に複雑に見えますが、テストしている現実とはまったく異なってしまいます。私はデータを挿入するクラスを使用して、SELECTが期待されるデータを返すことを確認するためにテストしたブログ記事で、私のサンプルコードで


データを読み取るクラスをテストするために、私はその逆をします。

  1. いくつかのテストデータを挿入して統合する方法を統合テストに記述します。私は通常、特定の文字列や数字のような列の少なくとも1つに何かを入れて、テストの後にそれらのレコードを正確に削除できるようにします。
  2. "Act" - 私がテストしているメソッドを呼び出し、データベースから読み込ませます。これは、通常、オブジェクトのコレクションを返します。
  3. 返されるオブジェクトのプロパティが、挿入した値と一致することを「アサート」します。
+0

ありがとう、スコット!私はDBデータリーダーを模擬しようとすると、単体テストがテストされたコードよりも複雑になることに同意します。統合テストは、その目的のための素晴らしい選択肢になります。しかし、コードのテストで頻繁にDBにデータを書き込む/削除する必要がある場合には、いくつかの懸念があります。 –

+0

特定のテストの値を分離するために使用する定数値がある場合に最適です。あなたのテストクリーンアップでそのようにして、それを削除すると、残りのデータが残ってしまうことはありません。それぞれのテストでランダムなものを生成することさえできます。しかし、すべてのシナリオでうまくいくわけではありません。たとえば、トリガーがあると問題が発生します。 –

関連する問題