2012-12-24 5 views
5

コード内の式が正しく書かれているかどうかを調べるには、特定のコレクションで式を実行する必要があります。例のために、私はいくつかの不必要な文脈を除外しますが、誰かがそれを必要とするならば、ただコメントして、私は質問を編集し、必要なものを追加します。メソッドグループエラーを取得せずにMoqでこの式を作成するにはどうすればよいですか?

のは、私は、次のしているとしましょう:

public interface IRepository 
{ 
    IQueryable<T> Query<T>(Expression<Func<T, bool>> expression); 
} 

public class Repository : IRepository 
{ 
    public IQueryable<T> Query<T>(Expression<Func<T, bool>> expression) 
    { 
     return _session.Query<T>(expression); 
    } 
} 

を、私は次のようなスペックを書きたい:

internal class when_executing_some_query : given_some_repository_context 
{ 
    Establish context =() => 
    { 
     IQueryable<SomeObject> objects = new List<SomeObject> 
     { 
      SomeObject1, 
      SomeObject2, 
      SomeObject3, 
     }.AsQueryable(); 

     _expectedList = new List<SomeObject> 
     { 
      SomeObject1, 
      SomeObject2, 
     }; 

     MockedRepository.Setup(x => x.Query<SomeObject>(Moq.It.IsAny<Expression<Func<SomeObject, bool>>>) 
      .Callback<Expression<Func<SomeObject, bool>>>(expression => _actualExpression = expression); 
    } 

    Because of =() => _actualList = objects.Select(_actualExpression).ToList(); 

    It should_execute_on_queryable_and_return_the_expected_items =() => //compare _expectedList with _actualList 
} 

しかし、私は

言っ Moq.It.IsAny<Expression<Func<SomeObject, bool>>>上でビルドエラーを取得しています

'Project.Domain.IRepository.Query(System.Linq.Expressions.Expression>)'に最適なオーバーロードされたメソッドがあります。持っているいくつかの無効な引数が

引数1:エラーを修正するには、 `

答えて

13


'> System.Linq.Expressions.Expression' に 'メソッドグループ' から変換することはできませんこのようにメソッドを呼び出す必要があります。引数として渡さないでください。

Moq.It.IsAny<Expression<Func<SomeObject, bool>>> 

へ:

Moq.It.IsAny<Expression<Func<SomeObject, bool>>>() 

注括弧ちょうどあなたの呼び出しからに変更します。

3

this answerに基づいて、その後()が必要です。 It.IsAny<Expression<Func<SomeObject, bool>>>()

0

上記の具体的なリポジトリが含まれていますが、この仕様では決して使用されていないので、例として考えてみましょう。さらに、仕様には虚偽のリポジトリとセットアップクエリメソッドがありますが、実行されることはありません。この仕様は、リポジトリを使用する具体的なものをテストする必要があります。次に、渡された式を照会メソッドと比較することができます。

表現は厄介ですが、モックではさらにそうです。私がすることは、Moqの検証を使用し、MoqのMoq.It.Is <>を使用して、式が一致する場合にのみ検証が成功することを保証することです。ここでは例です:

_repo.Verify(x=>x.Query(Moq.It.Is<Expression<Func<SomeObject, bool>>>(exp=>exp.Compile().Invoke(_exampleSomeObject))); 

基本的に、ここで私は、与えられた実際の式が_exampleSomeObject上で動作するかどうかを確認するだけで合格することを部品番号を言っています。

私は自分のiPhoneに入力しているので、コードがすぐにコンパイルされない場合はお詫び申し上げます。

ちょっとした提案:あなたのセクションは、結果を引き起こす何らかのアクションを表現する必要があるからです。今のところ、バスは以前の結果を処理するだけなので、あなたのように見えます。

0

セットアップでは、SomeObjectを渡しています。
コールバックで、InstanceHealthReportを要求しています。

InstanceHealthReportがSomeObjectのサブクラスであっても、セットアップとコールバックを一致させる必要があると私は信じています。

希望に役立ちます。投稿用のコードを「ジェネリック作る」ための試みで、単にタイプミスだった

コリン・

+0

おっとは、それを指摘してくれてありがとう、私はそれに応じて編集しました –

関連する問題