2016-11-09 815 views
2

我有一个测试项目来测试.net核心WebAPI。 DependencyContext.Default中的WebAPI项目抛出错误DependencyContext.Default在.NET核心中抛出错误测试项目

Value cannot be null. 
Parameter name: assembly 

这是发生在

at Microsoft.Extensions.DependencyModel.DependencyContextLoader.Load(Assembly assembly) 
    at System.Lazy`1.CreateValue() 
    at System.Lazy`1.LazyInitValue() 
    at 

会不会是测试项目没有DI解析器,因为没有入口点?

+0

你能提供更多关于你的项目的信息吗?例如:project.json,测试方法,您用于测试的工具,等等。 –

回答

4

DependencyContext.Default使用Assembly.GetEntryAssembly()探测组件加载。对于在Kestrel下运行的ASP.NET Core应用程序,它是一个控制台应用程序,所以有一个有效的入口程序集。

在单元测试环境中,其中在AppDomain被创建并加载到运行在隔离的试验中,所创建的应用程序域不具有条目组件。为了设置进入组装,因为你没有访问AppDomain中创建代码,你必须建立你的启动类之前,使用了一下反思:

// 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); 

之前,你的单元测试代码只是把这个创建或调用Startup类。

+1

仅供参考我在这个https://github.com/dotnet/core-setup/issues/1017上打开了.NET Core的一个问题 –

相关问题