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

时间:2016-10-05 08:20:39

标签: c# unit-testing xunit

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

我应该注意到不愉快的后果吗?我将向我的DB包装器类添加一个公共方法,但该方法不会造成任何损害。我会通过XUnit将我的应用程序直接“消耗”,而不是像我以前那样在单独的项目中进行测试,但这似乎无害,不是吗?

1 个答案:

答案 0 :(得分:2)

将SelfTest()方法添加到生产代码中对功能没有直接影响。但是你的想法是这样的 ' babaric'违反了我们称之为清洁法典的几项原则。

仅举几点:

  • 首先,这将违反单一责任原则。除了功能本身,班级有责任自己测试。
  • 课程中添加了更多代码和更多复杂性。如果有人对理解功能感兴趣,谁想要阅读所有测试代码?
  • 您可以向生产代码添加其他依赖项(在本例中为XUnit),并且程序集将成为已发布产品的一部分。

但是另一种方法是什么?

为了测试而公开所有方法和属性也不合适。但是使用assembly.cs中的InternalsVisibleTo注释,您可以为测试项目程序集提供访问要测试的程序集的内部方法和属性的权限。

示例:

在MyAssembly的assembly.cs中添加

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

然后在MyAssembly.UnitTests中可以使用内部方法。