【问题标题】:Moles hosting unable to resolve dependent assemblyMoles 托管无法解决依赖程序集
【发布时间】:2012-05-15 07:28:36
【问题描述】:

我正在开发一种同时使用 RhinoMocks 和 Moles 的测试方法。我已根据需要将测试方法的主机类型声明为 Moles。现在,当 RhinoMocks 必须发出运行时程序集来为接口创建模拟时,抛出 FileNotFoundException,指向我的一个私有 DLL,它实际上与测试 DLL 和 DLL 位于同一文件夹中包含被测类。

但是当我删除 HostType 属性时,模拟实例的创建工作正常,没有任何异常。

因此,我使用以下步骤构建了一个解决方法,以使其与 Moles 主机类型一起使用:

1) 我在 [TestInitialize] 中注册了 AppDomain.CurrentDomain.AssemblyResolve 事件

2) 在事件处理程序中,我封装了以下逻辑:

System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        string asmPath = Environment.CurrentDirectory + "\\" + args.Name.Split(',')[0] + ".dll";
        if(System.IO.File.Exists(asmPath))
            return System.Reflection.Assembly.Load(new System.Reflection.AssemblyName(args.Name));
        return null;
    }

现在,正如预期的那样,在 Moles HostType 下执行测试时,确实会调用此程序集解析器。测试现在运行。

但问题仍然是:

1) 为什么我仍然需要一个单独的程序集解析器,即使我们使用

将 AppDomain 的 APPBASE 路径显式设置为包含我的所有生产 DLL 和测试 DLL 的文件夹
AppDomain.CurrentDomain.SetData("APPBASE", Environment.CurrentDirectory);

我检查了当前目录确实是我的 bin 文件夹,可以找到每个二进制文件,包括测试 DLL。

2) 为什么我在测试我的其他一些生产 DLL 时没有遇到此错误,其中涉及相同的依赖项。

3) 使用 NMock2 时也会出现此问题,我试图查看这是否是 RhinoMocks 特有的问题。但事实证明,即使 NMocks2 在 Reflection.Emit 步骤中也存在相同的问题,其依赖 DLL 与 RhinoMocks 相同。有什么办法解释吗?

【问题讨论】:

    标签: moles


    【解决方案1】:

    您缺少的部分是,当您运行单元测试时,正在运行的应用程序是单元测试托管应用程序。该应用程序的 CurrentDirectory 可能是其运行器的安装目录。您的程序集与参数一起传递给应用程序。

    假设 CurrentDirectory 是您的应用程序的目录是错误的,这解释了第 1、2 和 3 点。

    【讨论】:

    • 这不仅仅是我假设当前目录是正确的目录。我在调试器中检查了它,你也可以在我的 AssemblyResolve() 处理程序中看到,我直接从当前目录加载失败的 DLL 并且它可以工作 - 也证明我当时的当前目录确实是我的 bin 文件夹预计可以找到 DLL 的位置。此外,正如我在 (2) 中提到的,涉及测试我的另一个 DLL 的类似设置可以在没有这些体操的情况下工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 2017-01-06
    • 2012-10-12
    • 1970-01-01
    • 2016-02-16
    • 2017-04-27
    • 2021-01-04
    相关资源
    最近更新 更多