我们把我们所有的单元测试,在自己的项目。 我们发现,我们必须做出某些类别的公众,而不是内部只是为单元测试。 反正是有,以避免这样做。 什么是通过使类公共而非密封式的内存意味着什么呢?
Answer 1:
如果您使用.NET中, InternalsVisibleTo集属性允许您创建“朋友”组件。 这些是被允许访问其它组件的内部类和成员具体的强命名程序集。
请注意,这应该谨慎,因为它紧密结合所涉及的组件一起使用。 对于InternalsVisibleTo一个常见的用途是用于单元测试项目。 它可能不是在实际的应用程序组件一起使用的不错的选择,由于上述原因。
例:
[assembly: InternalsVisibleTo("NameAssemblyYouWantToPermitAccess")]
namespace NameOfYourNameSpace
{
Answer 2:
如果它是一个内部类,那么就不能得到单独使用。 因此,你真不该除了测试一些其他类,使得使用该对象的内部测试它。
正如你不应该测试类的私有成员,你不应该测试DLL的内部类。 这些类是一些公开访问类的实现细节,因此应该通过其他单元测试很好地行使。
这个想法是,你只是想测试一个类的行为,因为如果你测试内部实现细节,然后你的测试将会产生脆性。 你应该能够改变任何类的实现细节,而不会破坏所有的测试。
如果你发现你真的需要测试类,那么你可能要重新审视为什么类是摆在首位的内部。
Answer 3:
以作记录
可替代地可以通过使用实例化内部类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*/ });
泛型类型有不同的工艺波纹管:
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*/});
Answer 4:
类可以是公共和密封。
但是,不这样做。
你可以创建一个工具,以反映在内部类,并发出它通过反射访问所有的新类。 MSTest的做到这一点。
编辑:我的意思是,如果你不希望在您的原装配-any-测试的东西; 如果成员是私有,这也适用。
文章来源: Making code internal but available for unit testing from other projects