c# - 实现接口(interface)的具体类是否应该有额外的公共(public)方法进行测试?

标签 c# unit-testing oop

<分区>

在具体类上实现接口(interface)时,公开额外的公共(public)方法以帮助促进单元测试是否合适?

例如,假设我有以下具体类:

public class MyClass : IMyInterface
{
    public int InterfaceMethod(ComplexObject complexObject)
    {
        return NonInterfaceMethodOne(complexObject) 
            + NonInterfaceMethodTwo(complexObject);
    }

    public int NonInterfaceMethodOne(ComplexObject complexObject)
    {
        //Do complex logic that needs to be unit tested
    }
    public int NonInterfaceMethodTwo(ComplexObject complexObject)
    {
        //Do more complex logic that needs to be unit tested
    }
}

如果我这样写我的类,我可以对两种非接口(interface)方法进行单元测试,但我觉得这种模式不正确。有没有更好的办法?

最佳答案

你那里的东西对我来说看起来完全可以接受。对您的问题的一般回答是“视情况而定”,因为在某些情况下您想要隐藏这些方法,也可能在某些情况下您想要公开它们。

将您的测试套件视为您的代码库的第一个客户端是合理的,并且支持您的客户端的需求是有意义的——您仍然需要仔细考虑您想要公开和隐藏的功能。

尽管 NonInterfaceMethodOneNonInterfaceMethodTwo 都是公开的,但如果将此实现注入(inject)到接口(interface)类型的参数中,客户端仍然只能访问到接口(interface)方法,并且不知道其他 2 个方法。

使用实现的客户端当然可以访问所有 3 个方法,但仍然不知道接口(interface)方法是如何实现的。

如果公开这些方法以进行单元测试有用,并且您可以确定将这些方法公开不会造成任何损害,那么请将它们公开。

但是,编写测试以确保 NonInterfaceMethodOneNonInterfaceMethodTwo 以您想要的方式工作,然后用另一个测试覆盖您的接口(interface)方法可能仍然是合适的),然后您可能不再需要涵盖 NonInterfaceMethodOneNonInterfaceMethodTwo 的单元测试——在这种情况下,您可以删除这些测试,然后制作 NonInterfaceMethodOneNonInterfaceMethodTwo 是私有(private)的——因为覆盖接口(interface)方法的单元测试覆盖了其他 2 种方法。

  • 如果您发现这种方法没有隐藏您的测试套件需要的任何功能,我会倾向于这种方法,因为通常最好限制您公开的功能

关于c# - 实现接口(interface)的具体类是否应该有额外的公共(public)方法进行测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57632038/

相关文章:

java - 如何使用 Spring Boot + Spring Data JPA 对悲观锁定进行单元测试

unit-testing - 如何为需要引用“静态生命周期并实现同步”的函数提供模拟值?

c# - 强制 Mpeg 2 解复用器使用 ffdshow 渲染 H 264 数字电视视频

c# - web.config中的自定义错误页面,错误信息会丢失吗?

c# - 相同的随机值

python - 测试全类属性

c# - 从 .Net 访问 C++ com 对象(版本信息)

javascript - Web应用程序是否可能存在松耦合?

javascript - 使用 getter/setter 获取动态对象属性

c# - 向接口(interface)的实现者介绍 "Mandatory"方法