我正在使用一个模拟(使用 Moq)设置一个测试IQueryable
,我想在.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);
}
我已经在嘲笑 s 了MockableDependency
,所以我实际上不需要担心Poco
s 中的内容pocos
。但是,我希望能够控制的值recentPocos.Count
是什么,并且我希望能够知道无论在访问pocos
之前运行了多少个查询,它都会返回相同的值.Count
。