【问题标题】:Calling original method with Moq使用 Moq 调用原始方法
【发布时间】: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。
  • 好建议,没想到...星期五!

标签: c# mocking moq


【解决方案1】:

在您的模拟中将 CallBase 设置为 true。这将调用原始虚拟方法或属性(如果它们存在),并且尚未设置为返回固定值。

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

【讨论】:

  • 甜心,今天要发疯了。谢谢。
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多