如何访问另一个程序集中的类以进行单元测试?

时间:2009-07-31 09:59:11

标签: c# unit-testing .net-assembly

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

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

  1. MyProject(C#)
  2. MyProjectTests(C#测试项目)
  3. MyProject中的所有内容目前都具有默认辅助功能,如果我没记错,这意味着一切都有效internal。我主要希望在class级别进行测试,但有一些delegates参与。

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

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

6 个答案:

答案 0 :(得分:34)

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

添加

[assembly:InternalsVisibleTo("MyProjectTests")]

到MyProject程序集中的AssemblyInfo.cs。

答案 1 :(得分:3)

您需要添加

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

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

答案 2 :(得分:3)

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

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

更多信息是here

答案 3 :(得分:1)

您似乎需要InternalsVisibleToAttribute

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

答案 4 :(得分:1)

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

  • 使用Reflection

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

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

答案 5 :(得分:1)

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

要点:

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