C# 如何对一个私有构造函数的类进行单元测试?

10

好的,我刚得到一个任务,需要对一个有私有构造函数的类执行单元测试。

现在当所有方法都是非静态时,我该如何进行单元测试而不初始化类呢?

有没有办法可以对一个有私有构造函数的类进行单元测试(不使用反射)?


基本上,没有反射就不可能实现。但你可以发布代码示例,看看能否解决问题。 - cuongle
4
如何创建这些类的实例?使用工厂方法?单例模式?我喜欢单元测试展示代码中的设计问题。 - Ilya Ivanov
我猜这个类是单例模式。你能确认一下吗? - jacob aloysious
你能否在问题中添加该类的一小段代码以提供更多上下文? - Ryan Gates
不,它不是单例类。它只有两个重载的私有构造函数和两个私有方法。 - Win Coder
5个回答

17

如果您无法将类设置为公共的,仍然可以通过以下方式轻松创建其实例来测试它:

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

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

另一个有用的测试方法是,如果您有内部方法(不是私有方法),您可以通过使内部可见来访问它们以供测试类使用。您可以在具有内部方法的类的assemblyinfo.cs中添加此行:

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

你如何创建一个假的/模拟实例而不是真实的实例? - Daniel B.
如果无参构造函数是私有的,则此方法无法正常工作。 - more urgent jest

8
如果这个类有一个私有构造函数,那么这个类被公开使用吗?如果不是,最好不要对其进行单元测试。如果是这种情况,那么公开的代码应该通过调用它自己来测试此代码。
单元测试是用于测试将被公众使用的代码 - 例如在应用程序层之间进行接口编码。输入一些内容,我希望得到这个输出。这就是单元测试的真正意义。单元测试并不关心实际方法中的内容。只要它返回所需的结果,执行所需的操作,就算是通过了测试。

实际上,这个类里面没有任何公共的东西。 - Win Coder
6
那你该怎么使用它? - bas
今天,当我要求澄清时,有人告诉我实际上我必须纠正代码中的错误。比如将某些内容公开化... - Win Coder
2
私有构造函数可以用于保护状态,例如DDD实体的情况,同时使得类库(如Entity Framework)仍然能够实例化该类。而公共构造函数只存在于能够实例化处于有效状态的实体的参数列表中。通过私有构造函数创建一个(无效的)实体足以测试单个方法的行为。试图模拟实体的所有其他要求(其中许多具有自己的私有或内部构造函数)需要大量的设置,这是不必要的。 - Douglas Gaskell
通常一个类会有静态方法来创建实例,而不是调用 new - JAlex

2

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


0

它可能是单例模式,你不希望该类有公共构造函数。 使用以下装饰器修饰构造函数: [ExcludeFromCodeCoverage]


0

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

创建一个非静态类,您无法创建实例,即仅限私有构造函数,可能永远没有用处,换句话说,它永远不是可单元测试的

为了进行单元测试:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接