IQueryable
が呼び出されたときに自分自身を返したいモック(Moqを使用)を使用してテストを設定して.Where()
います:
[SetUp]
public void Setup() {
mockPocos = new Mock<IQueryable<Poco>>();
mockPocos.Setup(foo => foo.Where(It.IsAny<Expression<Func<Poco, bool>>>()))
.Returns(mockPocos.Object);
}
(このようにして、のようなメソッド/プロパティをモックでき、.Count
テストされているメソッドがクエリを実行する回数に関係なく、IQueryable
制御できる値を返すことがわかります。)
これはコンパイルされますが、実行すると次の例外が発生します。
Tests.PocoTest.TestPocoQueryable:
SetUp : System.NotSupportedException : Expression references a method that does not belong to the mocked object: foo => foo.Where<Poco>(It.IsAny<Expression`1>())
どうすればこれを機能させることができますか?
編集:コメントに応えて、これが私がこのようにMoqを使いたい理由です。
私がテストしているメソッドには、次のようなコードがあります。
public int[] MethodToTest(IQueryable<Poco> pocos, MockableDependency dependency)
{
var mostRecentUpdate = (from poco in pocos
select poco.Date_Last_Updated).Max();
var recentPocos = pocos.Where(x => x.Date_Last_Updated.CompareTo(mostRecentUpdate) >= 0);
///...snip...
result[0] = SomePrivateCalculation(recentPocos.Count);
result[1] = dependency.DoADifferentCalculation(recentPocos);
}
私はすでにをモックしているので、実際に何が入ってMockableDependency
いるかを心配する必要はありません。ただし、の値を制御できるようにしたいので、アクセスする前に何回クエリを実行しても同じ値が返されることを知りたいです。Poco
pocos
recentPocos.Count
pocos
.Count