如何访问另一个程序集中的类以进行unit testing?

我正在开始对Visual-Studio 2008方式进行unit testing,我想知道为了测试目的,完成跨程序集class访问的最佳方法是什么。

基本上,我在一个解决方案中有两个项目:

  1. MyProject(C#)
  2. MyProjectTests(C#测试项目)

MyProject中的所有内容当前都具有默认的可访问性,如果我没记错,这意味着一切都是internal 。 我主要想在class上进行测试,但是有一些delegates参与其中。

将来某个时候可能会有一个外部API,但我大约有20%的function完整(至少在纸面上)并且我非常谨慎地在这个未经测试的核心上层叠更多代码。 因此,我想在应用程序完成足够传统(读取:坏和/或懒惰)function测试之前完成一些测试,并且肯定在版本n + 1外部API启动之前完成。

除了直接的答案,我们将非常感谢解决方案的一个例子。

您可以使用程序集级属性InternalsVisibleToAttribute来实现此目的。

 [assembly:InternalsVisibleTo("MyProjectTests")] 

到MyProject程序集中的AssemblyInfo.cs。

您可以通过向主项目的AssemblyInfo.cs添加属性来测试内部方法,从而可以访问命名程序集的内部方法:

[组件:InternalsVisibleTo( “MyProjectTestsNameSpace.MyProjectTests”)]

更多信息在这里

你需要添加

 [assembly:InternalsVisibleTo("Unit.Tests.Assembly")] 

到你的“MyProject(C#)”的AssemblyInfo.cs。 然后,您的测试可以访问内部测试方法。

看起来你需要InternalsVisibleToAttribute

但是我建议不要使用这种方法 – 通过公共接口或API测试你的内部类。

尽管[InternalsVisibleTo]是IMO最明智的方式,但至少还有其他两种方法:

  • 通过使用reflection

      var method = instance.GetType().GetMethod( methodName, BindingFlags.NonPublic | BindingFlags.Instance, null, paramTypeArray, null); return method.Invoke(instance, parameters); 

这种方法的问题在于,如果方法名称或签名发生变化,unit testing将在运行时开始失败,而[InternalsVisibleTo]在编译时很容易被这个重大变化所取代。

  • 使用像Moles / Fakes TypeMockTypeMock这样的测试框架

我找到了这个https://msdn.microsoft.com/en-us/library/hh598957.aspx希望它可以帮助某人。

摘要:

  • 在unit testing项目中,添加对测试代码的引用。 以下是在同一解决方案中创建对代码项目的引用的方法:
  • 在Solution Explorer中选择项目。
  • 在项目菜单上,选择添加引用….
  • 在“参考管理器”对话框中,打开“解决方案”节点并选择“项目”
  • 检查代码项目名称并关闭对话框。