代码之家  ›  专栏  ›  技术社区  ›  rodbv

用moq调用原始方法

  •  40
  • rodbv  · 技术社区  · 15 年前

    我有一个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());
    
    1 回复  |  直到 15 年前
        1
  •  67
  •   womp    15 年前

    在你的模型上把callbase设置为true。这将调用原始的虚拟方法或属性(如果它们存在),并且还没有设置为返回封闭值。

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