2010-06-18 69 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

相关问题