11

メソッドへのすべての引数を「リクエスト」オブジェクトとしてカプセル化し、「レスポンス」オブジェクトを返すパターンに従うコードに取り組んでいます。ただし、MOQ でのモックに関しては、これによりいくつかの問題が発生しました。例えば:

public class Query : IQuery
{
    public QueryResponse Execute(QueryRequest request)
    {
        // get the customer...
        return new QueryResponse { Customer = customer };
    }
}

public class QueryRequest
{
    public string Key { get; set; }
}

public class QueryResponse
{
    public Customer Customer { get; set; }
}

...私のテストでは、キーが与えられたときに顧客を返すようにクエリをスタブしたい

var customer = new Customer();
var key = "something";
var query = new Mock<ICustomerQuery>();

// I want to do something like this (but this does not work)
// i.e. I dont care what the request object that get passed is in but it must have the key value I want to give it

query.Setup(q => q.Execute(It.IsAny<QueryRequest>().Key = key))
     .Returns(new QueryResponse {Customer = customer});

私が望むことはMOQで可能ですか?

4

2 に答える 2

0

カスタムマッチャーでこれを行うことができると思います。

moqのQuickStartページから:

// custom matchers
mock.Setup(foo => foo.Submit(IsLarge())).Throws<ArgumentException>();
...
public string IsLarge() 
{ 
  return Match.Create<string>(s => !String.IsNullOrEmpty(s) && s.Length > 100);
}

私はあなたが同様のことをすることができると思います。Match.Create<QueryRequest>キーを照合するために使用するメソッドを作成します。

public QueryRequest CorrectKey(string key)
{
    return Match.Create<QueryRequest>(qr => qr.Key == key);
}

その後

_query.Setup(q => q.Execute(CorrectKey(key))).Returns(new QueryResponse {Customer = customer});

注: 私はこのコードを試していないので、完全に壊れていたら許してください。

ああ、少し関連性のある自己宣伝について: まさにこの種の複雑さが、Moq やその他のモック ツールについて私を悩ませているのです。これが、通常のコードでメソッド引数をチェックできるモック ライブラリを作成した理由です: http://github.com/eteeselink/FakeThat。ただし、大規模なリファクタリング (および名前の変更) プロセスの最中であるため、息を止めてください。それでも、あなたがそれについてどう思うかを聞いて、私はわくわくします。

編集:ああ、@nemesvは(おそらく)より良い答えで私を打ち負かしました。まぁ。

于 2013-06-06T12:55:50.493 に答える