【发布时间】:2010-06-18 21:10:18
【问题描述】:
我有一个 ProductRepository,它有 2 个方法,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());
【问题讨论】:
-
我只会将您的 ProductRepository 子类化,而不是 Mock 它。您的“FakeProductRepository”将返回一个硬编码的产品列表,您可以针对该列表测试 GetProductsByType。
-
好建议,没想到...星期五!