![](/img/trans.png)
[英]Visual Studio 2019 unit test fails with InvalidProgramException
[英]Visual Studio 2015 InvalidProgramException in Unit Test With Fakes
我正在使用Visual Studio 2015 Enterprise RTM為使用Unity Container的項目編寫單元測試。
我發現為Unity添加偽造程序集的簡單行為,甚至實際上不使用偽造,足以生成此異常:
System.InvalidProgramException:公共語言運行時檢測到無效程序。
請考慮以下步驟來重現:
使用Visual Studio 2015 Enterprise RTM創建面向.NET 4.6的單元測試項目
添加NuGet包“Unity”版本3.5.1404.0
添加NuGet包“CommonServiceLocator”1.2.0版
像這樣寫一個單元測試:
[TestClass]
public class UnitTest1 : IDisposable
{
[TestMethod]
public void TestMethod1()
{
new ResolvedArrayParameter<IDisposable>(new IDisposable[] {this});
}
void IDisposable.Dispose()
{
}
}
驗證測試通過
右鍵單擊Microsoft.Practices.Unity參考並選擇“Add Fakes Assembly”
重新運行測試
觀察以下顯着的測試失敗:
測試名稱:TestMethod1
測試FullName:UnitTestProject11.UnitTest1.TestMethod1
測試源:c:\\ temp \\ UnitTestProject11 \\ UnitTestProject11 \\ UnitTest1.cs:第12行
測試結果:失敗
測試持續時間:0:00:00.0572447結果StackTrace:
在Microsoft.Practices.Unity.ResolvedArrayParameter..ctor(類型arrayParameterType,Type elementType,Object [] elementValues)
在Microsoft.Practices.Unity.ResolvedArrayParameter`1..ctor(Object [] elementValues)
在C:\\ temp \\ UnitTestProject11 \\ UnitTestProject11 \\ UnitTest1.cs中的UnitTestProject11.UnitTest1.TestMethod1():第13行
結果消息:
測試方法UnitTestProject11.UnitTest1.TestMethod1拋出異常:
System.InvalidProgramException:公共語言運行時檢測到無效程序。
這個問題最顯着的特點是顯然假貨甚至不需要直接出現在代碼中就無法顯示。
大量的擺弄表明,將測試項目重新定位到.NET 4.5“修復”了這個問題,這對我來說是一個非首發因素,因為我在幾周后發布了另一個問題。
幾乎所有的假貨設置(代碼合同等)都更難以解決問題。
關於這個問題的任何建議都將非常感謝。
唯一的通用解決方案是確保所有部件都與您正在使用的CLR版本匹配,並且VS具有最新更新。
這個問題沒有靈丹妙葯。 在注入假貨時,您需要知道(挖掘)項目中所有連接部件的CLR版本兼容性。 請注意,“兼容性”可能只是明顯的問題,但更常見的是,最終代碼生成方式和虛擬機版本的細微差別。
這些事情通常對於運行和調試無關緊要,因為有幾個層可確保次要版本差異無關緊要,或者您無法切換到聲明與其兼容的代碼。
但是,當您使用Fakes時,“系統”會將原始代碼注入您的(包括第三方庫),這意味着它會跳過大多數檢查 - 否則無法工作。 但是,當實際運行代碼時,引擎(虛擬機)必須對其自身的安全性/完整性進行一些檢查,如果聲明看起來不夠匹配,它往往會變得偏執和紓困。
這就是為什么有人詢問涉及的議會是強名還是簽名的原因。 這是“系統”真正信任的唯一保證級別。 如果沒有它,它將進行一定程度的猜測,而對於正常運行而言,如果對代碼注入很重要的話,這通常無關緊要。
我仍然沒有談論可能存在的實際問題 - 這都是假設實際代碼很好並且只是聲明混淆了。 你可以嘗試使用它,但這需要花費大量的時間和精力。 更容易檢查是否可以獲得更好匹配的程序集版本。
當您將味道切換回4.5時,錯誤消失的事實告訴您,所涉及的某些程序集對於4.6來說不夠“接近”,或者可能存在一些代碼注入的故障,這些故障是由您未接受的更新修復的然而。
是的,它涉及很多痛苦,但這是想要進入前沿的代價。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.