2013-07-29 48 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

相關問題