2010-06-18 74 views
36

我有一個帶有2個方法GetAllProducts和GetProductByType的ProductRepository,我想在GetProductByType上測試邏輯。在內部,GetProductByType調用GetAllProducts,然後過濾正確的。使用Moq調用原始方法

public virtual IEnumerable<Product> GetAllProducts() 
{ 
    //returns all products in memory, db etc 
} 

public virtual IEnumerable<Product> GetProductsByType(string type) 
{ 
    return (from p in GetAllProducts() where p.Type == type select p).ToList(); 
} 

所以在我的測試,我想嘲笑調用GetAllProducts,所以它會返回在我的測試中定義的產品的列表,然後調用原始GetProductsByType,這將消耗嘲笑GetAllProducts。

我正在嘗試像下面的代碼,但原來的GetProductByType不執行,它也被嘲笑。在TypeMock中,我有一個CallOriginal方法來解決這個問題,但我無法用Moq弄清楚它。有任何想法嗎?

var mock = new Mock<ProductRepository>(); 
mock.Setup(r => r.GetAllProducts()).Returns(new List<Product>() {p1, p2, p3}); 
var result = mock.Object.GetProductsByType("Type1"); 
Assert.AreEqual(2, result.Count()); 
+2

我只是自己繼承你的ProductRepository而不是模擬它。您的「FakeProductRepository」將返回硬編碼的產品列表,您可以針對該列表測試GetProductsByType。 – 2010-06-18 21:17:06

+0

偉大的建議,沒有想到...星期五! – rodbv 2010-06-18 21:20:16

回答

56

在您的模擬中設置Call​​Base爲true。這將調用原始虛擬方法或屬性(如果它們存在),並且尚未設置爲返回固定值。

var mock = new Mock<ProductRepository>() { CallBase = true }; 
+0

甜蜜的,今天想要這樣做會生氣。謝謝。 – PmanAce 2016-05-31 19:38:18

相關問題