1

我的应用程序的 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 吗?这甚至是明智的吗?

在构建我缺少的项目时,我需要做些什么吗?

4

1 回答 1

0

即使我确定这两个副本来自同一个构建生成(版本),我的反射加载也失败了。

是的 - 如果两种类型来自两个不同的Assembly对象,那么就 CLR 而言,它们是不同的类型。这些程序集可以从完全相同的字节序列加载,但它们仍然是不同的程序集。

基本上,您需要为每种类型选择一个 Assembly使用。

于 2012-05-23T15:00:22.600 回答