2013-03-15 39 views
48

我想写一个类库为我创建一个复杂的对象,但只应尽可能少地暴露。我希望它被包含到其他项目中,并且在那里我只有一个对该库的调用,例如,返回一个内部创建的类的对象。我不想让别人明确地创建这些对象,但我仍然想为这个类库创建一个测试项目。如何测试内部类库?

例如:

var result = Manager.Instance.Create(definition) 

这应该是对类库的唯一通道。

根据定义参数,它使用不同的子类来创建请求的实例并相应地设置它的属性。因此,我想通过测试以确保整个创建过程正常工作。但是因为我也不想公开很少的结果对象的内部属性,我不能通过使用这个公共访问方法来测试,因为我没有任何属性来断言。

我知道你不应该测试内部机制,它通常是不好的设计,我也通过this article阅读,但没有任何办法可以创建一个库加单元测试项目,也许以后限制访问这个班?用包装什么的?

+0

您使用的是哪种语言? – 2013-03-15 19:52:00

+0

Duplicate:http://stackoverflow.com/q/358196/492 – 2013-11-06 10:40:34

回答

123

在.NET中可以使用InternalsVisibleToAttribute在你的类库,使您的内部类型可见你的单元测试项目。

这样你可以保持你的课程内部,并仍然使用它从你授予访问权限的其他程序集。

你使用这样的:

[assembly:InternalsVisibleTo("NameOfYourUnitTestProject")] 
+0

不知道!谢谢! – 2013-03-16 11:30:03

+10

伟大的解决方案!一些额外的信息: 1)在此情况下'[组件:...]'语法不按门铃:这些都是集属性(http://msdn.microsoft.com/en-us/library/4w8c1y2s。 aspx),其中最着名的是'AssemblyVersionAttribute'及其兄弟。 2)您可以在项目中的任何.cs文件中使用这些文件,位于名称空间之外,但通常在位于“属性”项目文件夹中的'AssemblyInfo'文件中指定它们。 3)如果这些不同,你必须确定你的项目的*名称*,而不是*名称空间*。 – 2014-05-09 06:57:24

+0

太棒了,我不知道有人能做到这一点,你每天都会学到新的东西! – MaYaN 2016-01-19 11:20:32