在内部编写代码,但可用于其他项目的unit testing

我们把所有的unit testing放在自己的项目中。 我们发现我们必须公开某些类而不是内部的unit testing。 无论如何要避免这样做。 把课程公开而不是密封起来的内存含义是什么?

如果您使用.NET, InternalsVisibleTo程序集属性允许您创build“朋友”程序集。 这些是特定的强命名程序集,允许访问其他程序集的内部类和成员。

请注意,这应该谨慎使用,因为它紧密地耦合相关的程序集。 InternalsVisibleTo通常用于unit testing项目。 由于上述原因,在实际应用程序中使用它可能不是一个好的select。

如果它是一个内部类,那么它不能被孤立地使用。 因此,除了testing其他内部使用该对象的类之外,您不应该真正进行testing。

就像你不应该testing一个类的私有成员一样,你不应该testing一个DLL的内部类。 这些类是一些可公开访问的类的实现细节,因此应该通过其他unit testing来很好地运行。

这个想法是,你只想testing一个类的行为,因为如果你testing内部的实现细节,那么你的testing将是脆弱的。 您应该能够在不中断所有testing的情况下更改任何类的实现细节。

如果你发现你真的需要testing这个类,那么你可能想重新考虑为什么这个类是内部的。

用于文档目的

或者你可以使用Type.GetType方法实例化内部类

 //IServiceWrapper is public class which is //the same assembly with the internal class var asm = typeof(IServiceWrapper).Assembly; //Namespace.ServiceWrapper is internal var type = asm.GetType("Namespace.ServiceWrapper"); return (IServiceWrapper<T>)Activator .CreateInstance(type, new object[1] { /*constructor parameter*/ }); 

对于genericstypes,有不同的过程如下:

 var asm = typeof(IServiceWrapper).Assembly; //note the name Namespace.ServiceWrapper`1 //this is for calling Namespace.ServiceWrapper<> var type = asm.GetType("Namespace.ServiceWrapper`1"); var genType = type.MakeGenericType(new Type[1] { typeof(T) }); return (IServiceWrapper<T>)Activator .CreateInstance(genType, new object[1] { /*constructor parameter*/}); 

课程可以是公开的和密封的。

但是,不要这样做。

您可以创build一个工具来反映内部类,并发出一个新类,通过reflection访问所有内容。 MSTest做到这一点。

编辑:我的意思是,如果你不想在你的原始程序集中包含任何东西, 如果成员是私人的,这也是有效的。