9

メソッドチェーンを通じて、いくつかの小さな流暢なインターフェースを作成しました。通常、Web サービスやデータベースからデータを取得する多数のリポジトリを呼び出します。

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

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

流暢なインターフェイスの個々のコンポーネントを単体テストできますが、上記の FindComputers メソッドを単体テストしたい場合はどうすればよいですか?

  1. 流暢なインターフェースの具体的な実装を使用し、Repository クラスに期待値を記述します
  2. 流暢なインターフェイス自体をモックし、それに期待を設定します
  3. FindComputers() メソッドではなく、流暢なインターフェイス自体のみをテストします

簡単に維持できるアプローチを見つけたいと思います。

4

3 に答える 3

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を追加する必要があり、それを知る前に神オブジェクトがあります。臭い!

于 2009-08-18T16:02:46.500 に答える
1

リポジトリをモックできますか? 1 つのクラスの 1 つのメソッドを分離する必要がある、より純粋なアプローチを提唱する人もいますが、FindComputers と流暢なインターフェイスがどのように連携するかをテストするには適切な方法です。また、リポジトリ アクセス レイヤーがどのように見えるかによっては、より単純になる場合もあります。

于 2009-08-17T22:50:22.363 に答える
0

私は2+3をします。流暢なインターフェースが本当にインターフェースであると仮定すると、それらは比較的簡単にモックできるはずです。呼び出しチェーンの各ステップは、おそらく新しいモック オブジェクトを返す必要があることに注意してください。これは、チェーン内の次の呼び出しを想定しています。

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

于 2009-08-17T22:26:56.233 に答える