C# Moq:如何在linq内部调用方法谓词来模拟查询?
关于堆栈溢出的主题,几乎没有类似的问题,但我发现与Moq本身无关 我试图完成的是包装以下查询的“where”部分: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
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。