这就是我们不测试私有方法的原因
这篇文章是我很久以前,在遥远的银河系里,发布在我博客上的。它是我正在连载的“单元测试101”系列文章的一部分。
尝试测试私有方法会导致很多混乱。
这是我们初次接触单元测试时都会遇到的常见问题。最近,我在Reddit上也看到了同样的问题:
谁能解释一下为什么对私有方法进行单元测试是不好的?
我的完整回答如下:
因为我们不想破坏封装性。
如果有一个私有方法,你打算如何从测试类或方法中调用它?
它是私有的。你只能从同一个类内部访问它。这就是访问修饰符的意义所在:限制对保存类内部状态的字段和属性的访问。
请不要将私有方法设为公共静态方法,以便在单元测试中直接调用它们。它们之所以设为私有是有原因的,对吧?我们不希望代码的其他部分直接使用它们。
编写测试时最常见的错误就是暴露内部实现。我以前见过并修复过这种错误。
我们以HasAdmin()题目中的方法为例,
private bool HasAdmin(List<string> relations, bool hasPermission)
{
// Beep, beep, boop...
}
除非HasAdmin()该方法没有引用(如果是这种情况,你应该删除它),否则同一个类中的另一个方法正在调用它。你可以沿着方法调用链追溯到某个公共方法。
HasAdmin()或者方法调用链中任何其他私有方法,都会改变一些你可以从公共方法中观察到的东西。它很可能影响了返回值,或者改变了你可以用 getter 方法检查的内部状态。这才是你应该测试的内容。
为了进行测试HasAdmin(),创建一个User具有正确关系和权限的对象,调用你拥有的公共方法,并检查当用户是管理员或不是管理员时应该发生哪些变化。也许你可以返回只有管理员才能访问的额外数据,或者完成某个操作而不抛出异常UnauthorizedAccessException。
在测试通过公共方法暴露的可观察行为时,你是在间接地测试私有方法。
瞧!
无论你是单元测试新手还是经验丰富的开发者,都可以下载我的书《单元测试 101:从零到你的第一个测试》。本书涵盖了所有基础知识,帮助你用 C# 编写你的第一个单元测试。此外,你还将收到 5 个额外的课程,直接发送到你的邮箱,帮助你编写出更易读、更易维护的测试。
文章来源:https://dev.to/canro91/this-is-why-we-dont-test-private-methods-28ef