2012-01-24 12 views
2

スタックオーバフローに関するこのトピックに関する質問はほとんどありませんでしたが、Moqには何も関係がないことがわかりました。私が達成しようとしている何Moq:メソッドの述語をlinq内のmocksクエリに呼び出す方法は?

は、次のクエリの「場所」の部分をラップすることです:

MyObject o = (from mock in Mocks.Of<MyObject>() 
       where mock.Property == 1 
       select mock).First(); 

私は唯一の基準でラムダを渡すことができるように(すなわちmock.Property == 1部)。 - 時代のinifinite数 - とコードがハング述語がモックの無限の数に呼び出されたので、これは失敗している

public static T GetMockOf<T>(Func<T, bool> predicate) where T : class 
{ 
    T obj = (from mock in Mocks.Of<T>() 
      where predicate(mock) 
      select mock).First(); 
    return obj; 
} 
// ... 

MyObject o = GetMockOf<MyObject>(mock => mock.Property == 1); 

:私の最初の(そして失敗したが、明らかに)しようとすると、以下の通りでした。私はpredicate()の代わりにpredicate.Invoke()に切り替えようとしましたが、これはNotSupportedExceptionで終わります。

Stack Overflowで検索しているときに、Expressions、LinqKit、Dynamic Linqを使用して同様のタスクを提案したことに気付きましたが、私のようなLinqの新人にとっては、

私はMoqで可能なことを達成しようとしていますか?もしそうなら、それを達成する最も簡単な方法は何ですか?それが何か変わってもわかりませんが、元の.NETではなく、私のコーディングにmonoを使用しています。

+0

私はあなたが何かを達成しようとしているのか理解できません...ユニットテストを書いていますか? ...あなたはどのような機能をテストしていますか... ... 2番目のコードサンプルにはクラスがありますが、最初はクエリ...などです –

+0

ここでは取引があります:より宣言的な方法(例:mock.Method()== value)。しかし、私はlinq構文の残りの部分を(最初など)置き換えるので、linqクエリをメソッドにラップして、好きな宣言部分を持つラムダに渡したいMyObject o = GetMockOf (モック=> mock.Property == 1); –

答えて

1

これは、Moq v4で既にサポートされています。

MyObject o = Mock.Of<MyObject>(mock => mock.Property == 1); 
+0

ありがとう!私は十分深くドキュメンテーションを見ていないのはかなり恥ずかしいです。次回はもっとうまくやるよ! –

+0

残念ながら、機能仕様構文のドキュメントは散在しています。要約といくつかのリンクについては、私の[ブログエントリ](http://www.truewill.net/myblog/index.php/2011/04/20/moq_v4_functional_specifications)を参照してください。 – TrueWill

関連する問題