【问题标题】:Mock a specific base class method模拟特定的基类方法
【发布时间】:2018-02-08 10:16:24
【问题描述】:

我有一个场景,我对如何模拟基类感到困惑。

我的基类代码:

public class ParentClass
{
   public virtual int Sum()
   {
      return 0;
   }
}

我继承类的代码:

public class ChildClass : ParentClass
{
    public override int Sum()
    {
        return 1 + base.Sum();
    }
}

现在我想测试继承的 ChildClass.Sum() 方法,但想模拟 ParentClass.Sum() 方法,以便它返回一些非零的固定值。

无法弄清楚如何告诉模拟对象模拟基类方法,但使用派生类方法的实际实现。

这是我写的测试代码。

[TestClass]
public class ChildClassTest
{
    private Mock<ParentClass> _parentClassMock;


    [TestInitialize]
    public void Init()
    {
      _parentClassMock = new Mock<ParentClass>();
    }

    [TestMethod]
    public void GivenChildClass_WhenAdding_ThenResultShouldSumUp()
    {
        //Arrange
        SetupParentClassSumMethod();
        ChildClass child = new ChildClass();

        //Act
        int result = child.Sum();

        //Assert
        Assert.AreEqual(21, result);   
     }

     private void SetupParentClassSumMethod()
     {
        _parentClassMock.Setup(x => x.Sum()).Returns(20);
     }
}

Parent 类的返回值仍然为 0。

我想做的事是否可以实现?

【问题讨论】:

  • 如果你想对 ChildClass 的代码进行单元测试,那么你不需要创建任何类的 mock。您究竟想在这里实现什么目标?
  • Mocking 是一个注入不想测试的功能或外部服务(即服务调用)的过程。在这种情况下模拟是没有意义的。您不能模拟实例化类的基类,实例化类包括基类及其所有功能。如果基类调用了外部服务,那么您将使用依赖注入并模拟该依赖项,您在这里所拥有的不适合模拟。
  • 谢谢,我只是想知道它是否可以实现。
  • 如果你使用装饰器设计模式那么你可以实现它codeproject.com/Articles/479635/…
  • 谢谢你,Aman,但在我们的组织中,我们不会为了开发测试而触碰我们的实现代码。

标签: c# .net unit-testing moq


【解决方案1】:

我想做的事是否可以实现?

不,我认为这是通过模拟父类无法实现的。您可以做的是创建子类的可测试类,并设置要从基类返回的 Sum 的值。

public class ChildClassTestable : ChildClass
{
    public int SumOfParentReturnValue { set; get; }

    public override int Sum()
    {
        return 1 + SumOfParentReturnValue;
    }
}

那么测试可能看起来像这样。但这是你需要的吗?

//Arrange
ChildClassTestable child = new ChildClassTestable {SumOfParentReturnValue = 20};

//Act
int result = child.Sum();

//Assert
Assert.AreEqual(21, result);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多