关于c#:如何出于单元测试目的访问另一个程序集中的类?

How to access classes in another assembly for unit-testing purposes?

我正在进入对Visual Studio 2008方式进行单元测试的过程,并且我想知道什么是实现用于测试目的的交叉组装class访问的最佳方法。

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

  • MyProject(C#)
  • MyProjectTests(C#测试项目)
  • MyProject中的所有当前具有默认可访问性,如果我正确回想意味着所有内容均有效internal。我主要希望在class级别进行测试,但是涉及到一些delegates

    将来可能会使用外部API,但我大约有20岁拥有完整功能(至少在纸上)的方式所占的百分比,而我对在此未经测试的内核之上分层添加更多代码感到非常不快。因此,我想在应用程序完成足够的工作以进行传统(读取:错误和/或懒惰)功能测试之前,肯定要在n 1个外部API版本启动之前进行一些测试。除了直接的答案外,还将非常感谢您提供解决方案的示例。


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

    在MyProject程序集中的AssemblyInfo.cs中添加

    1
    [assembly:InternalsVisibleTo("MyProjectTests")]


    您需要将

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

    添加到" MyProject(C#)"的AssemblyInfo.cs中。然后,您的测试就可以访问内部测试方法。


    您可以通过以下方法测试内部方法:在主项目的AssemblyInfo.cs中添加属性,并允许访问命名程序集的内部方法:

    [assembly:InternalsVisibleTo(" MyProjectTestsNameSpace.MyProjectTests ")]

    更多信息在这里


    我发现了这个https://msdn.microsoft.com/zh-cn/library/hh598957.aspx希望它可以对某人有所帮助。

    摘要:

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

    尽管[InternalsVisibleTo]是IMO最明智的方式,但至少还有其他两种方法可以解决此问题:

    • 通过使用Reflection

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

    此方法的问题在于,如果方法名称或签名发生更改,则单元测试将在运行时开始失败,而[InternalsVisibleTo]在编译时很容易被此突破性更改引起。

    • 使用诸如Moles / FakesTypeMock的测试框架

    看起来您需要InternalsVisibleToAttribute

    但是我还是建议您反对这种方法-通过公共接口或API测试内部类。