2

リポジトリをモックしようとしています:

 var expMock = new Mock<IEntityRepository>();
 expMock.Setup(s => s.GetMany(It.IsAny<Expression<Func<Entity, bool>>>()))
        .Returns<IQueryable<Entity>>(r => 
                               new List<Entity>{ new Entity() } }.AsQueryable());

しかし、私がそれを呼び出すとき:

IEnumerable<Entity> source = _entityRepository.GetMany(w => w.IsActive);

私は例外を取得します:

System.ArgumentException : 'System.Linq.Expressions.Expression 1[System.Func2[Entity,System.Boolean]]' 型のオブジェクトは、'System.Linq.IQueryable`1[Entity]' 型に変換できません。

4

2 に答える 2

3

モックされたメソッドが返す値を返すだけです。あなたの場合、それはIQueryableになります:

expMock.Setup(s => s.GetMany(It.IsAny<Expression<Func<Entity, bool>>>()))
       .Returns(new List<Entity>{ new Entity() }.AsQueryable());

Returnsメソッドのジェネリック パラメータは、呼び出されたメソッドの引数の型です。もちろん、真ではない型のパラメータでメソッドを呼び出す必要があることをReturns<IQueryable<Entity>>意味します。そのため、この例外が発生します。GetManyIQueryable<Entity>

メソッドの引数は式なので、正しいモックのセットアップは次のようになります。

.Returns<Expression<Func<Entity, bool>>>(e => 
      new List<Entity> { new Entity() }.AsQueryable());

ただし、返された結果を提供するためのメソッド引数は必要ありません。上記のコードを使用してください。

于 2013-09-03T08:39:55.147 に答える
1

あなたのステートメントは、式を評価して結果を返すのではなく、呼び出されたときに返されるようにReturns()バインドしています。を取り出せば動くはずです。おそらく、型パラメーターがなくても問題を解決できます。FuncGetMany()r=>

于 2013-09-03T08:40:06.577 に答える