【发布时间】:2022-01-05 19:20:20
【问题描述】:
我有一个基类,它的受保护方法在我要测试的子类的公共方法中被调用。我没有找到一种方法来最小化基本保护方法,以便在子类中进行测试。
public class MyBaseClass
{
protected virtual bool MyMethod(int number)
{
return number == 1;
}
}
public class MyChildClass : MyBaseClass
{
public bool DoSomething(int number)
{
return MyMethod(number);
}
}
[TestFixture]
public class MyChildClassTests
{
[Test]
public void Expected_Returns_False_WhenPassed_1()
{
var myChildClass = new MyChildClass();
// How do I mock MyMethod used in myBaseClass here?
// var mock = new Mock<MyBaseClass>();
// mock.Protected().Setup<bool>("MyMethod", ItExpr.IsAny<int>()).Returns(false);
// The above mock is correct, but it's in a different instance object than myBaseClass
var result = myChildClass.DoSomething();
Assert.AreEqual(false, result);
}
}
我无法更改类以获得更好的架构,我必须尽我所能为DoSomething() 实现单元测试,到目前为止我所做的是模拟并准备该方法使用的所有数据,但是由于它在另一个班级,我希望我的MyChildClassTests 不做所有这些,只限于测试DoSomething()。
我已经阅读了关于部分模拟和许多其他问题和答案的文章,但我无法让它正常工作。
感谢任何建议!
编辑:忘了把public 放在所有的类中,在我的真实案例中,它们是公开的。
【问题讨论】:
-
由于您有一个虚拟方法,您可以创建一个 FakeChildClass 并覆盖 MyMethod() 。这将帮助您保护方法并对其进行单元测试。
-
对不起,我不听。覆盖 MyMethod 时我能得到什么?我如何嘲笑它?我要单元测试的方法是 DoSomething(),我将如何使用重写的 MyMethod() 测试 FakeChildClass?
-
你为什么要嘲笑这个?您正在对 MyChildClass 进行单元测试。这是一个非常简单的类,不需要为您计划进行的单元测试进行模拟。模拟更适合依赖于您不想启动以进行单元测试的抽象(例如,您将模拟数据层来测试业务层)。老实说,不知道在这里嘲笑你得到了什么。
-
@PaulAlanTaylor 我发布的类是简化示例,我的项目中 MyBaseClass 中的 MyMethod 非常复杂,并且调用其他 API 并具有 MyChildClass 没有的其他依赖项。这就是为什么当我为 MyChildClass 构建单元测试时,我不想提供模拟并设置 MyBaseClass 需要或使用的所有必需数据,我想模拟它并只关心 MyChildClass。 MyBaseClass 已经有自己的单元测试电池来测试 MyMethod(以及该类中的所有其他方法)的行为,我不想重复代码并再次将其放在 MyChildClass 上
-
即使您使用简化的问题示例,如果您澄清要测试的内容可能会有所帮助,因为它并不明显。例如,在您的示例代码中的某处,您可以放置一行来做某事,然后澄清 - 我想确保发生这种情况。
标签: c# unit-testing moq