【发布时间】: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