使代码内部化,但可用于其他项目的单元测试

时间:2020-03-06 14:28:32  来源:igfitidea点击:

我们将所有单元测试放在他们自己的项目中。我们发现,对于单元测试,我们必须将某些类公开,而不是内部类。无论如何要避免这样做。通过公开类而不是密封类,对内存有什么影响?

解决方案

类可以是公开的也可以是密封的。

但是,不要那样做。

我们可以创建一个工具来反映内部类,并发出一个通过反射访问所有内容的新类。 MSTest做到了。

编辑:我的意思是,如果我们不想在原始程序集中包括-anytesting的东西;如果成员是私人的,这也适用。

如果它是一个内部类,则不能孤立地使用它。因此,除了测试内部使用该对象的其他类之外,我们实际上不应该对其进行测试。

就像我们不应该测试类的私有成员一样,我们也不应该测试DLL的内部类。这些类是一些公共可访问类的实现细节,因此应通过其他单元测试很好地进行练习。

这个想法是我们只想测试一个类的行为,因为如果我们测试内部实现的细节,那么测试将很脆弱。我们应该能够更改任何类的实现细节,而无需破坏所有测试。

如果发现确实需要测试该类,则可能首先要重新检查该类为何是内部类。

如果我们使用的是.NET,则InternalsVisibleTo程序集属性允许我们创建"朋友"程序集。这些是特定的强命名程序集,允许它们访问内部类和另一个程序集的成员。

注意,应谨慎使用它,因为它会将相关的装配紧密结合在一起。 InternalsVisibleTo的常见用法是用于单元测试项目。由于上述原因,在实际的应用程序程序集中使用它可能不是一个好的选择。

例子:

[assembly: InternalsVisibleTo("NameAssemblyYouWantToPermitAccess")]
namespace NameOfYourNameSpace
{