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

问题描述 投票:3回答:1

我目前正在将一个项目迁移,并将其测试项目从.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();返回我想要的内容,而不是测试项目的程序集。

c# .net-core mstest appdomain .net-core-3.1
1个回答
0
投票

这里有两个可能的解决方案:

1]就像@ajz建议的那样,您可以使用GetEntryAssembly方法创建一个接口,该接口返回Assembly.GetEntryAssembly(),可以模拟/设置以返回测试所需的任何内容。

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

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

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

AssemblyHelper.GetEntryAssembly = () => assembly;

我们采用第二种解决方案的原因仅仅是因为我们曾经在静态构造函数中调用Assembly.GetEntryAssembly(),但我认为无论如何我都无法模拟对象并将其设置为字段,然后再进行操作。

© www.soinside.com 2019 - 2024. All rights reserved.