2016-11-09 814 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的一個問題 –

相關問題