如何在 .Net Core 中为测试设置 EntryAssembly

How to set EntryAssembly for tests in .Net Core

我目前正在将一个项目及其测试项目从 .Net Framework 迁移到 .Net Core。

在 .Net Framework 中,我们曾经能够做这样的事情来设置 EntryAssembly 以进行测试:

AppDomainManager manager = new AppDomainManager();
FieldInfo entryAssemblyfield = manager.GetType().GetField("m_entryAssembly", BindingFlags.Instance | BindingFlags.NonPublic);
entryAssemblyfield.SetValue(manager, assembly);

AppDomain domain = AppDomain.CurrentDomain;
FieldInfo domainManagerField = domain.GetType().GetField("_domainManager", BindingFlags.Instance | BindingFlags.NonPublic);
domainManagerField.SetValue(domain, manager);

取自此处:https://dejanstojanovic.net/aspnet/2015/january/set-entry-assembly-in-unit-testing-methods/

由于 AppDomainManager 在 .Net Core 中不再可用,我们如何才能完成类似的事情,以便 Assembly.GetEntryAssembly(); returns 我想要的而不是测试项目程序集。

这是我找到的两个可能的解决方案:

1) 就像@ajz 建议的那样,您可以使用 GetEntryAssembly 方法创建一个接口,该方法 returns Assembly.GetEntryAssembly() 您可以 Mock/Setup 到 return 任何你想要的供您测试。

2) 您可以像这样使用 GetEntryAssembly Func 创建一个 class :

public static class AssemblyHelper
{
    public static Func<Assembly> GetEntryAssembly = () => Assembly.GetEntryAssembly();
}

在您的测试方法中,您可以通过为它重新分配一个内联函数来覆盖此行为:

AssemblyHelper.GetEntryAssembly = () => assembly;

我们采用第二种解决方案只是因为我们过去常常在静态构造函数中调用 Assembly.GetEntryAssembly(),我认为无论如何我都无法模拟一个对象并将其设置为一个字段,然后再通过它。