我的應用程序的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()調用會給出不同的值。
我認爲有一點涉及隨機性。
我可以強制輸入嗎?那更明智嗎?
有什麼我需要做的,而建立我的項目,我失蹤了?
這種類型有多少個組件?一個類型由其程序集定義 –
debug/mydll.dll和relese/mydll.dll加載 – Johannes
爲什麼要加載這兩個文件? –