未能将namespaceA.objectA强制转换为namespaceA.objectA
我的应用程序的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()调用会给出不同的值。
我认为有一点涉及随机性。
我可以强制输入吗?那更明智吗?
有什么我需要做的,而建立我的项目,我失踪了?
即使我确定这两个副本是来自同一构建世代(版本)我的反射加载失败铸造失败。
是 - 如果两种类型来自两个不同的Assembly
对象,就CLR而言它们是不同的类型。程序集可以从完全相同的字节序列加载,但它们仍然是不同的程序集。
基本上你需要挑选一个Assembly
用于每种类型。
啊,我发现了随机性的原因。当我开始所有测试时,它会因为加载顺序不同而失败。当我只选择一个特定的集合加载顺序作品jsut罚款...所以这是正确的答案...我会接受它,一旦5分钟结束:) – Johannes
这种类型有多少个组件?一个类型由其程序集定义 –
debug/mydll.dll和relese/mydll.dll加载 – Johannes
为什么要加载这两个文件? –