使用 SelfTest() 方法测试私有成员

Testing private members with a SelfTest() method

我有一堆 class 包装数据库查询的 es。我希望能够测试-运行 每个查询,并验证结果,返回给我的私有成员class。 sp运行g 想到的可能是野蛮的想法是给我的查询包装器一个 public SelfTest() 方法,该方法对具有 [Fact] 属性的 XUnit 可见。因此,我的测试方法可以访问 class 的内部结构,并且可以详细验证数据库请求的结果。

我应该注意哪些不愉快的后果?我将向我的数据库包装器 classes 添加一个 public 方法,但该方法不会造成任何损害。我会直接通过 XUnit 'consumable' 制作我的应用程序,而不是像我习惯的那样在单独的项目中进行测试,但这似乎无害,不是吗?

将 SelfTest() 方法添加到生产代码中不会对功能产生直接影响。但你认为这是一种 'babaric' 是由于违反了我们称为 Clean Code 的几项原则造成的。

仅举几点:

  • 首先这会违反单一职责原则。除了功能本身,class 有责任自我测试。
  • 向 class 添加了更多代码和更多复杂性。如果有人只是对了解功能感兴趣,谁愿意阅读所有测试代码?
  • 您将额外的依赖项添加到您的生产代码(在本例中为 XUnit),程序集将成为您交付的产品的一部分。

但是什么是替代方法?

仅仅为了测试而制作所有方法和属性public也不合适。但是通过 assembly.cs 中的 InternalsVisibleTo 注释,您可以授予测试项目程序集访问程序集的内部方法和属性以进行测试的权利。

示例:

在 MyAssembly 的 assembly.cs 中添加行

[assembly:InternalsVisibleTo("MyAssembly.UnitTests")]

那么在MyAssembly.UnitTests内部方法就可以使用了