我有一个测试.net核心WebAPI的测试项目. DependencyContext.Default在WebAPI项目中抛出错误
Value cannot be null.
Parameter name: assembly
Run Code Online (Sandbox Code Playgroud)
它发生在
at Microsoft.Extensions.DependencyModel.DependencyContextLoader.Load(Assembly assembly)
at System.Lazy`1.CreateValue()
at System.Lazy`1.LazyInitValue()
at
Run Code Online (Sandbox Code Playgroud)
可能是那个测试项目没有DI解析器没有入口点吗?
DependencyContext.Default使用Assembly.GetEntryAssembly()来探测要加载的程序集.对于在Kestrel下运行的ASP.NET Core应用程序,它是一个控制台应用程序,因此有一个有效的条目程序集.
在单元测试环境中,创建并加载AppDomain以单独运行测试,创建的AppDomain没有条目程序集.为了设置条目程序集,由于您无权访问AppDomain创建代码,因此在构建Startup类之前必须使用一些反射:
// http://dejanstojanovic.net/aspnet/2015/january/set-entry-assembly-in-unit-testing-methods/
AppDomainManager manager = new AppDomainManager();
FieldInfo entryAssemblyfield = manager.GetType()
.GetField("m_entryAssembly", BindingFlags.Instance | BindingFlags.NonPublic);
entryAssemblyfield?.SetValue(manager, typeof(Startup).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)
只需在单元测试代码创建或调用Startup类之前放置它.
| 归档时间: |
|
| 查看次数: |
723 次 |
| 最近记录: |