2012-05-23 31 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

相关问题