我的应用程序的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
为什么要加载这两个文件? –