C# 类中私有函数的单元测试放在哪里?
维基百科中的一篇文章建议:
- 将测试与他们正在测试的成员放在同一个类中
- 使用部分类
就个人而言,这些方法似乎都不合适,我更喜欢将单元测试完全放在一个单独的项目中。
对此有什么想法吗?
(我知道关于是否应该测试私有方法存在相当多的争论。我想听听双方的争论。)
C# 类中私有函数的单元测试放在哪里?
维基百科中的一篇文章建议:
就个人而言,这些方法似乎都不合适,我更喜欢将单元测试完全放在一个单独的项目中。
对此有什么想法吗?
(我知道关于是否应该测试私有方法存在相当多的争论。我想听听双方的争论。)
私有方法不一定需要直接测试。您可以根据使用这些私有方法的公共方法的测试来确定它们的有效性。
但是,您应该注意确保您的公共方法可以轻松地将模拟依赖项注入您的私有方法中,以方便测试和模拟所有合理的场景。
编辑:至于你的其他测试应该放在哪里,我建议在你的项目中使用一个单独的子目录来处理你的测试。在为 PHP 应用程序编写测试时,我在项目的根目录中有一个tests目录,其目录结构与我真正的应用程序目录结构相同。在其中,我为每个真正的班级都有一个测试班。
只是不要在发布到生产环境时将测试类与项目的其余部分一起编译(或者对于像 PHP 这样的解释性语言,不要将测试类部署到生产网络服务器)。
不要对私有方法进行单元测试。单元测试用于测试类的可见(公共和受保护)接口。私有方法是实现细节,没有必要为它们编写单元测试(它们的行为应该通过对可见方法的测试隐式测试),导致脆弱的测试(因为实现细节可能会改变)并且是重构的障碍。
如果你有一个你觉得需要进行单元测试的私有方法,那是一个很大的暗示,也许它应该被分解到另一个类的公共方法中。
C# 类中私有函数的单元测试放在哪里?
无处。它们不存在。
一般来说,我的单元测试在单独的项目中。
我个人也喜欢在单独的项目中进行单元测试。如果要对私有方法进行单元测试,则可以将私有方法设为内部。然后,您可以通过将以下内容添加到 AssemblyInfo.cs 来使单元测试可以直接调用内部方法:
[assembly: InternalsVisibleTo("MyAssembly.UnitTests")]
你应该做对你有用的事情;这对我有用:
我的单位是一个班级:这就是我要测试的。不是方法。我正在尝试做面向对象的编程,所以我把注意力放在了对象上。
如果我发现自己想测试私有方法,我需要重构. 我只想直接测试一个私有方法,因为它和测试之间有太多其他代码,而且因为私有方法本身足够复杂,需要测试注意。因此,我通常会提取类以将该私有方法和其他相关成员拉入一个新类。
我的班级往往很小。它们易于阅读和理解。当然,我的方法也非常小且易于理解。
过渡到这种工作方式需要我重新思考我对编程的许多假设和习惯。曾经看似激进的事情现在似乎司空见惯。
我同意通常不应测试私有方法,因为您应该只测试公共接口。
话虽如此,您可能想要测试私有方法是有原因的:
您正在使用 TDD,并且您必须开发一个复杂的私有方法。可能需要为私有方法创建测试方法,以使您的编写测试-编写代码-测试周期保持在正确的粒度。
您可能是其他人可能需要修改私有方法的团队的一员,并且您希望进行测试以确保更改不会产生问题。
一些解决方案:
声明一些委托给私有方法并且仅用于测试目的的公共方法。这些可以作为前缀,例如 TestFoo1、TestFoo2 等。
使用内部
http://msdn.microsoft.com/en-us/library/7c5ka91b(VS.80).aspx
你的问题标题和第一句话是不同的。:)
我不确定在哪里放置您的测试。这将取决于语言和 C# 不是我熟悉的东西,但我想你的代码的很大一部分是在私有方法中。如果没有经过测试,我会感到不舒服。代码覆盖率会下降很多。
我们在 Visual Studio 中使用私有访问器来测试私有方法。这意味着测试类可以存在于单独的项目中。
但是,我们试图真正限制这些数量,因为: