2012-05-23 74 views
1

我的應用程序的EndToEnd測試包括手工加載釋放的對象。未能將namespaceA.objectA強制轉換爲namespaceA.objectA

在測試過程中我總是有下列加載: - 正調試組件 NUnit的影拷貝 - 氮素釋放組件Postbuildeventcopy

即使我敢肯定,這兩個副本都來自同一個構建代(版本)投射我的反射加載失敗。

給這裏的上下文的一點點是一些僞代碼:

private HookingHelper globalhooker; 
private Tools.ISomething globalmockery; 


TestfixtureSetUp(){ 
    globalhooker = new globalhooker(); 
    globalhooker.Loadfrom("c:\postbuildcopy.dll"); 
    globalmockery = Mockrepository.Generate<Tools.ISomething>(); 
    globalhooker.SetViaReflection<Tools.ISomething>("nameofsomething", globalmockery); 
} 

我有一個使用Loadfrom得到一個靜態的組件內部一個輔助類。在我打電話之前,我必須注入一個模擬。

這個模擬是使用調試版本中的工具庫的shadowcopy創建的,因爲nunit創建它。

加載的庫是發佈版本,這對我很重要,因爲我想盡可能接近真實環境進行測試。

當我嘗試使用反射來注入我必須使用FieldInfo SetValue(...)調用看起來是這樣的:

public static void ReplaceFieldPublicStatic<T>(Type type, string fieldname, T obj) 
    { 
     FieldInfo field = AssemblyHelper.GetFieldInfoPublicStatic(type, fieldname); 
     field.SetValue((T)obj, obj); 
    } 

Somethimes反思的作品,有時我的類型不能被鑄造成對方。

錯誤是由FieldInfo SetValue(...)生成的ArgumentException。

當我接受異常並調查field.FieldType != typeof(T)之間的區別時,只有GetHashCode()調用會給出不同的值。

我認爲有一點涉及隨機性。

我可以強制輸入嗎?那更明智嗎?

有什麼我需要做的,而建立我的項目,我失蹤了?

+2

這種類型有多少個組件?一個類型由其程序集定義 –

+0

debug/mydll.dll和relese/mydll.dll加載 – Johannes

+0

爲什麼要加載這兩個文件? –

回答

0

即使我確定這兩個副本是來自同一構建世代(版本)我的反射加載失敗鑄造失敗。

是 - 如果兩種類型來自兩個不同的Assembly對象,就CLR而言它們是不同的類型。程序集可以從完全相同的字節序列加載,但它們仍然是不同的程序集。

基本上你需要挑選一個Assembly用於每種類型。

+0

啊,我發現了隨機性的原因。當我開始所有測試時,它會因爲加載順序不同而失敗。當我只選擇一個特定的集合加載順序作品jsut罰款...所以這是正確的答案...我會接受它,一旦5分鐘結束:) – Johannes

相關問題