我的应用程序的 EndToEnd 测试包括手动加载已发布的文件。
在测试期间,我总是加载以下内容: - n 个调试程序集的 NUnit shadowcopy - n 个发布程序集的 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 在程序集中获取静态。在我调用任何东西之前,我必须注入一个模拟。
这个模拟是使用调试版本中工具库的影子副本创建的,因为 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);
}
有时反射有效,有时我的类型不能相互转换。
该错误是由 生成的 ArgumentException FieldInfo SetValue(...)
。
当我接受异常并调查field.FieldType != typeof(T)
只有 GetHashCode() 调用之间的区别时,会给出不同的值。
我认为这涉及到一点随机性。
我可以强制 Typecast 吗?这甚至是明智的吗?
在构建我缺少的项目时,我需要做些什么吗?