Moq:如何在linq中调用方法谓词来模拟查询?

时间:2012-01-24 22:06:35

标签: c# linq lambda moq

关于堆栈溢出的主题几乎没有类似的问题,但我发现没有任何与Moq相关的问题。

我想要完成的是包装以下查询的“where”部分:

MyObject o = (from mock in Mocks.Of<MyObject>() 
              where mock.Property == 1 
              select mock).First();

这样我就可以只用标准传递lambda(即mock.Property == 1部分)。我的第一次(显然是失败的)尝试如下:

public static T GetMockOf<T>(Func<T, bool> predicate) where T : class
{
    T obj = (from mock in Mocks.Of<T>() 
             where predicate(mock)
             select mock).First();
    return obj;
}
// ...

MyObject o = GetMockOf<MyObject>( mock => mock.Property == 1 );

这是失败的,因为谓词是在无限多次的模拟上调用的 - 无限次数 - 并且代码挂起。我尝试切换到predicate.Invoke()而不是谓词(),但这最终会导致NotSupportedException。

虽然通过堆栈溢出搜索,我注意到人们使用表达式,LinqKit或动态Linq的类似任务的建议,但是,它是非常困难的一个LINQ新秀像我挖到这些话题深度不够。

我想用Moq完成什么?如果是这样,最简单的方法是什么?不确定它是否会改变任何东西,但我使用单声道进行编码,而不是原始.NET。

1 个答案:

答案 0 :(得分:1)

Moq v4已经支持这一点。

MyObject o = Mock.Of<MyObject>(mock => mock.Property == 1);