2009-08-17 8 views
9

私は、メソッドチェインを使用して、少し流暢なインターフェイスを作成しました。通常は、Webサービス/データベースからデータを取得するリポジトリがいくつか呼び出されます。Fluentインターフェイスを使用する単体テストコードはどのようにして単体テストしますか?

流暢なインターフェイスを使用する単体テスト方法についてはどうすればよいですか?

Public IEnumberable<Computer> FindComputers(string serialNumber) 
{ 
     return Computers.FindBySerialNumber("YBCX00900") 
     .AttachConfiguration() 
     .EnsureAllComputersHaveConfiguration(); 
} 

私はユニット流れるようなインターフェイスの個々のコンポーネントをテストすることができますが、私はユニットテストに私が何をすべきかを上記FindComputers方法をしたい場合は?

  1. 流れるようなインターフェイスの具体的な実装を使用して、リポジトリクラス
  2. モック上 期待を書く流暢インタフェース自体を、その
  3. テストのみ流れるようなインターフェイス自体ではなく、FindComputersに期待を設定します()メソッド

私は簡単に保守可能なアプローチを見つけたいと思います。

答えて

3

私はFIが必要以上に機能していると思います。私はあなたがデータマッパーとしてコンピュータを使用していると仮定し、クエリを構築するためにも使用します。あなたが示されているものからクエリは、このから構築されています

rule 1: find configured computer with serial number = "whatever" and has-config = true. 
rule 2: find not-config computer with serial number = "whatever and has-config = true. 
rule 3: find configured computer with serial number = "whatever" and has-config = false. 
rule 4: find not-config computer with serial number = "whatever" and has-config = false. 
rule 5: find all computer with serial number = "whatever" and has-config = true. 
rule 6: find all computer with serial number = "whatever" and has-config = false. 

のように...

を今すぐ実装することができ、これらの規則のいくつかが間違っているようです。ルール2とルール3は交差するように見えます。ルール5とルール6は何をしますか?これは正しいのでしょうか?

SRPを中断するオブジェクトを実装しているためです。最初のステップでは、クエリービルダーをデータマッパーから分離します。 FIクエリオブジェクトを作成し、マッパーに渡します。

今度は、FindComputersをテストして、FIクエリオブジェクトがデータマッパーに送信されていることを確認できます。 FIクエリオブジェクトを作成できるようになったので、それをテストすることができます。また、データマッパーがクエリオブジェクトを使用しているかどうかをテストできます。

今後、場所によってコンピュータを検索する場合はどうなりますか。あなたが書いたのと同じコードを残しておけば、FindByLocationというメソッドを追加しなければなりません。そして、それを知る前に、あなたは神オブジェクトを持っています。臭い!

+0

ありがとうございます、あなたは正しい例ですが、私はFIを1つのクエリに分割し、1つはクエリに返されたデータに対して操作を実行します。 私は、FIを単体テストでテストするのが最も簡単であることを発見しました。次に、FIを具体的な実装で使用する単体テストメソッドを見つけました。目的の結果が返されたことをテストするだけです。 FIをモックしようとすると、テストが脆弱になります。 – Andronicus

0

私は2 + 3をします。流暢なインターフェースが真のインターフェースであると仮定すると、モックするのは比較的簡単でなければなりません。コールチェーンの各ステップがおそらく新しいモックオブジェクトを返すべきであることを認識すると、チェーン内の次のコールを期待しています。

また、流暢なインターフェイスを直接テストして、その下のリポジトリレイヤをモックする必要があります。

+0

入力のおかげで、 私は流暢なインターフェイスそのものをあざけるについて考え、ただのようなテストを書くために奇妙に思える... は(X => x.FindBySerialNumber(null)を)期待しています。Return(nextMock) Expect(x => x.AttachConfiguration())Return(nextMock) これは、すべての呼び出しが実際に行われたということです。モックオブジェクトのフル流暢なインターフェースを再作成する作業はたくさんあり、テスト中のメソッドにはっきりと記述されているものをテストするだけです。 – Andronicus

+0

私は単体テストカバレッジを行うのが初めてで、時には同じクライムを持っています。検査によってコードをレビューするのは簡単ですが、それはまだ手動によるレビューです。テストカバレッジを追加することで、このクラスについて考えなくても道を守ることができます。これはまた、流暢なインターフェースが必要以上に複雑であることを示している可能性があります。インターフェースが必要なものに集中していれば、テストが簡単になります。 –

1

あなたはあなたのリポジトリをモックできますか?あるクラスのメソッドを単離しなければならないより純粋なアプローチを提唱する人もいれば、FindComputersと流暢なインターフェースがどのように連携するかをテストすることができます。また、リポジトリのアクセスレイヤーの外観によっては、よりシンプルになる場合もあります。

関連する問題