使代码的内部,但可以从其他项目单元测试(Making code internal but avail

2019-06-24 16:13发布

我们把我们所有的单元测试,在自己的项目。 我们发现,我们必须做出某些类别的公众,而不是内部只是为单元测试。 反正是有,以避免这样做。 什么是通过使类公共而非密封式的内存意味着什么呢?

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