5

コード内の式が正しく記述されているかどうかを判断するには、特定のコレクションで式を実行する必要があります。例として、不要なコンテキストは省略しますが、必要な場合はコメントするだけで、質問を編集して必要なものを追加します。

私が次のものを持っているとしましょう:

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:「メソッドグループ」から
「System.Linq.Expressions.Expression>」に変換できません

4

4 に答える 4

14

このようなエラーを修正するには、引数として渡すのではなく、メソッドを呼び出す必要があります。次の場所から電話を変更するだけです。

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

に:

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

括弧に注意してください。

于 2012-12-24T19:59:12.917 に答える
3

この回答に基づくと()、後で必要になるようです。It.IsAny<Expression<Func<SomeObject, bool>>>()

于 2012-12-24T20:01:51.043 に答える
0

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

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

お役に立てば幸いです。

コリン

于 2012-12-24T20:25:35.463 に答える
0

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

表現には注意が必要ですが、モックの場合はさらに注意が必要です。私が行うことは、MoqのVerifyを使用してから、MoqのMoq.It.Is <>を使用して、式が一致する場合にのみ検証が成功することを保証することです。次に例を示します。

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

基本的に、ここでは、指定された実際の式が_exampleSomeObjectで機能する場合にのみ検証が通過することをMoqに伝えています。

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

ただの提案:あなたのbecauseセクションは、結果を引き起こす何らかのアクションを表現する必要があります。現在、バスは以前の結果のみを処理しているため、あなたのように見えます。

于 2012-12-24T20:15:52.380 に答える