我的应用程序的EndToEnd测试包括手动加载releasells。
在测试期间,我总是加载以下内容: - 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在程序集中获取静态。在我打电话之前我必须注射一个模拟器。
这个模拟是使用调试版本中工具库的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);
}
反思有时候会有效,有时我的类型也不会相互融合。
错误是由FieldInfo SetValue(...)
生成的ArgumentException。
当我接受异常并调查field.FieldType != typeof(T)
之间的差异时,只有GetHashCode()调用会给出不同的值。
我认为有一点随机性。
我可以强制使用Typecast吗?这是明智的吗?
在构建我缺少的项目时,我需要做些什么吗?
答案 0 :(得分:0)
即使我确定这两个副本来自同一版本生成(版本),我的反射加载也会失败。
是 - 如果两种类型来自两个不同的Assembly
对象,则就CLR而言,它们是不同的类型。程序集可以从完全相同的字节序列加载,但它们仍然是不同的程序集。
基本上,您需要选择一个 Assembly
以用于每种类型。