【问题标题】:unit testing a method that uses Assembly对使用 Assembly 的方法进行单元测试
【发布时间】:2017-04-05 22:33:55
【问题描述】:

我需要xUnit测试一个使用Assembly的方法,专门用参数Assembly.GetEntryAssembly()调用。

但不幸的是,在单元测试项目中,入口程序集似乎是testhost 而不是我的测试项目。这样我将无法搜索我的测试项目。这是否意味着我将无法测试此方法?还是另一种方式?

【问题讨论】:

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


    【解决方案1】:

    并非所有代码都应进行测试。将您使用Assembly.GetEntryAssembly() 的代码提取到一个单独的组件中,如下所示:

    public interface IAssemblyProvider
    {
          Assembly GetEntryAssembly();
    }
    
    public class AssemlbyProvider : IAssemblyProvider
    {
          public Assembly GetEntryAssembly()
          {
               return Assembly.GetEntryAssembly();
          }
    }
    

    并在您的代码中使用此抽象。无需测试这种单一方法 - 我们知道它有效,这是 .Net 框架的一部分。然后你想测试的代码应该使用IAssemblyProvider,所以你可以用存根替换它:

    // should only be visible in test project
    internal class StubAssemlbyProvider : IAssemblyProvider
    {
          public Assembly GetEntryAssembly()
          {
               return typeof(MyClassInEntryAssembly).Assembly;
          }
    }
    

    通过这种方式测试您的代码,但您不是在测试 .Net 框架代码。

    【讨论】:

    • 我似乎无法从 typeof(MyClassInEntryAssembly) 访问 Assembly。
    • 将 MyClassInEntryAssembly 替换为您在主项目中拥有的类的名称
    • 是的。我在主项目和测试项目中都尝试了一个类。
    • 你的班级有using System;吗?见小提琴:dotnetfiddle.net/aYZLsR
    • 是的,Core 中的反射与老式全脂框架中的反射不同。但无论如何你都会得到相同的结果。
    猜你喜欢
    • 2012-06-01
    • 1970-01-01
    • 2021-09-16
    • 2021-10-15
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    相关资源
    最近更新 更多