c# - 如何为 .Net Core 中的测试设置 EntryAssembly
问题描述
我目前正在迁移一个项目,它是从 .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();
返回我想要的而不是测试项目程序集。
解决方案
这是我发现的两种可能的解决方案:
1) 就像@ajz 建议的那样,您可以使用 GetEntryAssembly 方法创建一个接口,该方法返回Assembly.GetEntryAssembly()
您可以 Mock/Setup 以返回您想要的任何测试。
2)您可以像这样使用 GetEntryAssembly Func 创建一个类:
public static class AssemblyHelper
{
public static Func<Assembly> GetEntryAssembly = () => Assembly.GetEntryAssembly();
}
在您的测试方法中,您可以通过为其重新分配内联函数来覆盖此行为:
AssemblyHelper.GetEntryAssembly = () => assembly;
我们采用第二种解决方案只是因为我们曾经Assembly.GetEntryAssembly()
在静态构造函数内部调用,但我认为无论如何我都不能模拟一个对象并将其设置为一个字段,然后再通过它。
推荐阅读
- django - 检索 None 作为 entry_set django
- mysql - MySQL联合并从另一个表中计数
- python - 如何将数据库模型字段设置为只读,即使超级用户也应该能够编辑它
- azure-devops - Azure DevOps 管道是否可以同时具有模板化和非模板化作业?
- javascript - 遍历数组时如何选择性地对部分元素发出异步请求?
- pandas - 数据框列中的字符串列表行之间的成对距离
- npm - 如何使用 npm pack 打包最新的更改?
- cypress - 如何使用 FORM 数据在 cypress 中上传 .xsls 文件
- npm - 为什么我的电脑在安装mocha时会出错
- powershell - 将一个 powershell 脚本的输出解析为另一个脚本的输入