C# 如何使用Moq模拟/设置具有IEnumerable输入参数的方法?
我使用了DistinctBy方法,不同之处在于我没有将其用作扩展。现在我想为调用这个方法的另一个方法编写一个单元测试,所以我想设置返回 “与众不同”的方法C# 如何使用Moq模拟/设置具有IEnumerable输入参数的方法?,c#,installation,moq,ienumerable,C#,Installation,Moq,Ienumerable,我使用了DistinctBy方法,不同之处在于我没有将其用作扩展。现在我想为调用这个方法的另一个方法编写一个单元测试,所以我想设置返回 “与众不同”的方法 public IEnumerable DistinctBy( IEnumerable源,Func键选择器) { HashSet seenKeys=新HashSet(); foreach(源中的TSource元素) { if(seenKeys.Add(键选择器(元素))) { 收益-收益要素; } } } 初始设置 现在我有这样的功能(我使用
public IEnumerable DistinctBy(
IEnumerable源,Func键选择器)
{
HashSet seenKeys=新HashSet();
foreach(源中的TSource元素)
{
if(seenKeys.Add(键选择器(元素)))
{
收益-收益要素;
}
}
}
初始设置
现在我有这样的功能(我使用Autofac的Moq,Automock功能):
List listProduct=新列表{product1,product2};
mock.mock()
.Setup(r=>r.DistinctBy(It.IsAny(),It.IsAny())
.报税表(ieList)
.可验证();
但它不起作用。它显示的错误如下:
与…匹配的最佳重载方法。。。。有一些非法的论点,
和/或参数1:无法从转换
“System.Collections.Generic.List”到
'System.Collections.Generic.IEnumerable>'
首先,moq要求您可以使用moq接口方法或虚拟方法。所以首先要做的是做接口或虚拟方法。您的静态方法是不可模仿的 编辑 如果您的方法不是静态的,那么执行以下操作,您不需要验证
mock.Mock<Helpers>().Setup(r => r.DistinctBy(It.IsAny<IEnumerable<TSource>>(), It.IsAny<Func<TSource, TKey>>())).Returns(ieList);
mock.mock().Setup(r=>r.DistinctBy(It.IsAny(),It.IsAny()).Returns(ieList);
首先,moq要求您可以使用moq接口方法或虚拟方法。所以首先要做的是做接口或虚拟方法。您的静态方法是不可模仿的
编辑
如果您的方法不是静态的,那么执行以下操作,您不需要验证
mock.Mock<Helpers>().Setup(r => r.DistinctBy(It.IsAny<IEnumerable<TSource>>(), It.IsAny<Func<TSource, TKey>>())).Returns(ieList);
mock.mock().Setup(r=>r.DistinctBy(It.IsAny(),It.IsAny()).Returns(ieList);
很抱歉,我的方法不是静态的。我已经更新了代码。另外,IHelpers类包含此方法的接口,因此,我正在模拟此方法的接口。我已经尝试过类似的方法。该方法返回两个错误:--Error 7方法的类型参数。。。。无法从用法推断。尝试显式指定类型参数。--错误8找不到类型或命名空间名称“TSource”(是否缺少using指令或程序集引用?)——错误10找不到类型或命名空间名称“TKey”(是否缺少using指令或程序集引用?),是否知道发生这种情况的原因?谢谢你,我的方法不是静态的。我已经更新了代码。另外,IHelpers类包含此方法的接口,因此,我正在模拟此方法的接口。我已经尝试过类似的方法。该方法返回两个错误:--Error 7方法的类型参数。。。。无法从用法推断。尝试显式指定类型参数。--错误8找不到类型或命名空间名称“TSource”(是否缺少using指令或程序集引用?)——错误10找不到类型或命名空间名称“TKey”(是否缺少using指令或程序集引用?),是否知道发生这种情况的原因?谢谢
mock.Mock<Helpers>().Setup(r => r.DistinctBy(It.IsAny<IEnumerable<TSource>>(), It.IsAny<Func<TSource, TKey>>())).Returns(ieList);