2016-05-13 51 views
0

我有一個情況我有,在一個組件中使用System.Web.Http.SelfHost.HttpSelfHostServer一個客戶端應用程序作爲結果的依賴性是對V4.0.0.0靶向.net4.0一些碼System.Web.Http.dll破碎的向後兼容性在System.Web.Http

我也有這是一個的WebAPI,靶向.net4.6.1服務器上的一些其他的代碼。該組件對System.Web.Htpp.dll v5.2.3的依賴

一切都正常運行。

但我來寫一個自動化集成測試(作爲一個單元測試),在該過程中需要實例系統的兩個部分(沒有IIS或類似物的腳手架)。單元測試程序集必須是.net4.6.1(因爲它依賴於服務器端程序集)。這意味着單元測試程序集中對System.Web.Http的引用會將v5.2.3帶入其bin文件夾。

在運行時這導致ReflectionTypeLoadException在我的app.config的LoaderException

"{"Inheritance security rules violated by type: 'System.Web.Http.SelfHost.HttpSelfHostConfiguration'. Derived types must either match the security accessibility of the base type or be less accessible.":"System.Web.Http.SelfHost.HttpSelfHostConfiguration"}" 

(用於單元測試組件)我有一個運行時rediect:

<dependentAssembly> 
    <assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" /> 
    <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" /> 
    </dependentAssembly> 

這意味着我的。 net4依賴被強制使用System.Web.Http的v5.2.3。

沒有這個運行時重定向客戶端組件抱怨缺少的依賴(System.Web.Http V4.0.0.0),如果我有System.Web.Http V4.0.0.0在bin目錄(但不v5.2.3),那麼服務器端程序集抱怨缺少的依賴關係。

有什麼辦法可以解決這個問題嗎?對我來說,它看起來像System.Web.Http v5.2.3不向後兼容。

enter image description here

+0

爲什麼不分開單元測試項目? –

+0

只有一個單元測試項目。單元(集成測試)實例化一個客戶端和服務器,然後繼續調用其中一個或另一個的某些功能,並聲明一切都按預期發生。服務器和客戶端(生產代碼)的代碼分爲兩個獨立的程序集,第三個單元測試引用兩者。對不起,如果不明確 – MikeW

+0

爲什麼不在實例化自己的進程中的服務器?即使你設法解決它,你的集成測試將不再代表實際發生的事情,因爲真正的服務器和真實的客戶端使用不同的代碼。具有代表性可能是集成測試中最重要的部分。顯然,如果你的服務器在自己的進程中運行,那麼做輸入/輸出測試就會涉及更多,因爲你不能直接看到它的大腦,但是,這應該是一個集成測試。 –

回答

2

事實證明,這是簡單了很多比它高處望去。客戶端代碼是使用System.Web.Http.SelfHost.HttpSelfHostServer的客戶端代碼,因此它將程序集System.Web.Http.SelfHost.dll拖入bin目錄。

單元測試組件拉動System.Web.Http.dll作爲它和服務器側需要它。

selfhost dll是v4.0.0.0,system.web.http是v5.2.3。這是問題的來源。此修復程序旨在確保System.Web.Http.SelfHost.dll的v5.2.3位於bin目錄中,並將重定向添加到單元測試程序集的app.config。