C# Moq:如何在linq内部调用方法谓词来模拟查询?

C# Moq:如何在linq内部调用方法谓词来模拟查询?,c#,linq,lambda,moq,C#,Linq,Lambda,Moq,关于堆栈溢出的主题,几乎没有类似的问题,但我发现与Moq本身无关 我试图完成的是包装以下查询的“where”部分: MyObject o = (from mock in Mocks.Of<MyObject>() where mock.Property == 1 select mock).First(); MyObject o=(来自Mocks.Of()中的mock) 其中mock.Property==1 选择mock.Fi

关于堆栈溢出的主题,几乎没有类似的问题,但我发现与Moq本身无关

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

MyObject o = (from mock in Mocks.Of<MyObject>() 
              where mock.Property == 1 
              select mock).First();
MyObject o=(来自Mocks.Of()中的mock)
其中mock.Property==1
选择mock.First();
这样我就可以只通过标准(即mock.Property==1部分)传递lambda。我的第一次尝试(显然是失败的)是:

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 );
public static T GetMockOf(Func谓词),其中T:class
{
T obj=(来自mock in mock.Of()中的mock)
where谓词(mock)
选择mock.First();
返回obj;
}
// ...
MyObject o=GetMockOf(mock=>mock.Property==1);
这是失败的,因为谓词被无限次调用(有限次),代码挂起。我尝试切换到predicate.Invoke()而不是predicate(),但结果是NotSupportedException

在搜索堆栈溢出时,我注意到有人建议使用表达式、LinqKit或动态Linq来完成类似的任务,然而,像我这样的Linq新手很难深入研究这些主题


我想用最小起订量实现的目标可能吗?如果是,最简单的方法是什么?不确定它是否改变了什么,但我正在使用mono进行编码,而不是原始的.NET。

这已经得到MOQv4的支持

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

我不明白您在这段时间里想要完成什么。。。你在写单元测试吗。。。你在测试什么功能?。。。第二个代码示例有一个类,但第一个只是一个查询。。。etc:)这里有一个交易:在LINQtoMock中,我喜欢以更具声明性的方式设置mock的能力(例如mock.Method()==value)。但是,我不喜欢linq语法的其余部分(where、first等),因此我希望将linq查询包装在一个方法中,并将一个lambda与我喜欢的声明性部分一起传递给它,以便能够在我的单元测试中使用:MyObject o=getmokof(mock=>mock.Property==1);谢谢我很惭愧没有深入阅读文档。下次我会做得更好!不幸的是,功能规范语法的文档是分散的。有关摘要和一些链接,请参见my。