2013-07-29 49 views
0

我已经使用了this DistinctBy方法,但我没有将它用作扩展。现在我想为另一个调用这个方法的方法编写单元测试,所以我想设置返回。如何使用Moq模拟/设置IEnumerable输入参数的方法?

的 “DistinctBy” 梅托德

public IEnumerable<TSource> DistinctBy<TSource, TKey>(
     IEnumerable<TSource> source, Func<TSource, TKey> keySelector) 
{ 
    HashSet<TKey> seenKeys = new HashSet<TKey>(); 
    foreach (TSource element in source) 
    { 
     if (seenKeys.Add(keySelector(element))) 
     { 
      yield return element; 
     } 
    } 
} 

初始设置 现在我有这样的事情(我使用Autofac的起订量,Automock功能):

List<Product> listProduct = new List<Product>{ product1, product2 }; 
mock.Mock<IHelpers>() 
    .Setup(r => r.DistinctBy<List<BeautyBoutiqueArticle>, int>(It.IsAny<List<BeautyBoutiqueArticle>>(), It.IsAny<Func<List<BeautyBoutiqueArticle>, int>>())) 
    .Returns(ieList) 
    .Verifiable(); 

但它不起作用。它显示像错误:

的最佳重载的方法匹配....有一些非法参数, 和/或参数1:不能从 “System.Collections.Generic.List”转换为 “系统.Collections.Generic.IEnumerable>'

回答

0

首先,moq要求您可以使用moq接口方法或虚拟方法。所以首先要做的是界面或虚拟方法。您的静态方法是不是mockable

EDITED

如果你的方法是不是静态然后进行以下操作,你不需要核查的

mock.Mock<Helpers>().Setup(r => r.DistinctBy(It.IsAny<IEnumerable<TSource>>(), It.IsAny<Func<TSource, TKey>>())).Returns(ieList); 
+0

比较遗憾的是,我的方法不是一成不变的。我更新了代码。 此外,IHelpers类包含此方法的接口,所以,我嘲笑该方法的接口。 – DarkJoy

+0

我已经试过类似的东西。该方法返回了几个错误: ---错误\t 7无法根据用法推断方法....的类型参数。尝试明确指定类型参数。 ---错误\t 8类型或命名空间名称“TSource”找不到(是否缺少using指令或程序集引用?)\t ---错误\t 10的类型或命名空间名称TKEY的“无法找到(您是否缺少使用指令或程序集参考?) 您可能知道为什么会发生这种情况? 谢谢 – DarkJoy

相关问题