Sim*_*ley 5 c# mstest appdomain .net-core .net-core-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);
Run Code Online (Sandbox Code Playgroud)
取自这里:https : //dejanstojanovic.net/aspnet/2015/january/set-entry-assembly-in-unit-testing-methods/
由于 AppDomainManager 在 .Net Core 中不再可用,我们如何完成类似的事情,以便Assembly.GetEntryAssembly();返回我想要的而不是测试项目程序集。
这是我发现的两种可能的解决方案:
1)就像@ajz建议的那样,您可以使用 GetEntryAssembly 方法创建一个接口,该方法返回Assembly.GetEntryAssembly()您可以 Mock/Setup 来返回您想要的测试的任何内容。
2)您可以使用 GetEntryAssembly Func 创建一个类,如下所示:
public static class AssemblyHelper
{
public static Func<Assembly> GetEntryAssembly = () => Assembly.GetEntryAssembly();
}
Run Code Online (Sandbox Code Playgroud)
在您的测试方法中,您可以通过为其重新分配内联函数来覆盖此行为:
AssemblyHelper.GetEntryAssembly = () => assembly;
Run Code Online (Sandbox Code Playgroud)
我们采用第二种解决方案只是因为我们过去常常Assembly.GetEntryAssembly()在静态构造函数内部调用,而且我认为无论如何我都无法在执行该操作之前模拟对象并将其设置为字段。