C# 如何使用Moq模拟/设置具有IEnumerable输入参数的方法?

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(键选择器(元素))) { 收益-收益要素; } } } 初始设置 现在我有这样的功能(我使用

我使用了DistinctBy方法,不同之处在于我没有将其用作扩展。现在我想为调用这个方法的另一个方法编写一个单元测试,所以我想设置返回

“与众不同”的方法

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);