我有一个包含2个方法的ProductRepository,GetAllProducts和GetProductByType,我想在GetProductByType上测试逻辑。在内部,GetProductByType调用GetAllProducts,然后过滤正确的。
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());
答案 0 :(得分:68)
在模拟上将CallBase设置为true。这将调用原始虚拟方法或属性(如果存在),并且尚未设置为返回固定值。
var mock = new Mock<ProductRepository>() { CallBase = true };