【问题标题】:C# Unit testing class with a private constructor?带有私有构造函数的 C# 单元测试类?
【发布时间】:2013-03-27 16:22:55
【问题描述】:

好的,所以我刚刚得到一个任务,我必须使用私有构造函数对一个类执行单元测试。

当所有方法也是非静态的时,我想如何在不初始化类的情况下进行单元测试。

有什么方法可以对具有私有构造函数的类进行单元测试(无需反射)?

【问题讨论】:

  • 基本上,没有反射是不可能的,但你可以发布你的代码示例,看看它是否可以解决
  • 如何创建这些类的实例?工厂方法?辛格尔顿?我喜欢单元测试在您的代码中显示设计问题。
  • 我猜,这个类是单例的。你能确认一下吗?
  • 您能否在您的问题中添加该类的 sn-p 以提供更多上下文?
  • 不,它不是单例类。它只有 2 个重载的私有构造函数和 2 个私有方法。

标签: c# .net unit-testing nunit


【解决方案1】:

如果您无法公开该类,您仍然可以通过以下方式创建它的实例来轻松对其进行测试:

var anInstance = (YourPrivateClass)Activator.CreateInstance(typeof(YourPrivateClass), true);

这将为您提供一个您可以填充的类的实例。

另一个有用的测试位是如果你有内部方法(不是私有的),你可以通过让你的测试类可以看到内部来访问它们。您将这一行添加到具有内部方法的类的 assemblyinfo.cs 中:

[assembly: InternalsVisibleTo("YourSolution.Tests")]

【讨论】:

  • 你怎么能创建一个假的/模拟的实例而不是一个真实的?
【解决方案2】:

如果这个类有一个私有的构造函数,这是要公开使用的吗?如果没有,最好不要对其进行单元测试。如果是这种情况,公开的代码应该通过调用它来测试它本身。

单元测试用于测试公众使用的内容 - 例如,通过在应用层之间连接代码。输入,我想要这个输出。这就是单元测试的真正意义所在。单元测试并不关心实际方法中的内容。只要它返回您想要的内容,执行所需的操作,您就可以通过。

【讨论】:

  • 事实上,课堂上没有任何公开内容。
  • @WinCoder 那你到底是怎么用它的?
  • 今天当我要求澄清时,我被告知我也必须纠正代码中的错误。就像把东西公之于众......
  • 私有构造函数可用于保护状态,例如 DDD 实体的情况,同时使实体框架等库仍然可以实例化类。而公共构造函数只存在于可以将实体实例化为有效状态的参数。通过私有构造函数创建一个(无效的)实体对于测试单个方法的行为是足够的。尝试和模拟实体的所有其他要求是不必要的设置(其中许多都有自己的私有或内部构造函数)......
  • 通常一个类有静态方法来创建实例而不是调用new
【解决方案3】:

您应该通过公共 API 进行测试——必须有某种方式来实例化和使用您要测试的类。

【讨论】:

    【解决方案4】:

    通常编写和运行单元测试以确保代码符合其设计并按预期运行。

    创建一个 non-static 类,您不能在其上创建实例,即仅私有构造函数,可能永远不会有用,换句话说,它永远不会是 Unit Testable

    为了可单元测试:

    1. 您应该能够创建该类的实例。
    2. 可测试函数应该是公共或内部。 您可以通过将程序集设置为 Friend Assembly 来测试内部功能

    【讨论】:

      【解决方案5】:

      它可能是一个单例,并且您不想要该类的公共构造函数。 用以下方式装饰构造函数: [ExcludeFromCodeCoverage]

      【讨论】:

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