托管无法解决依赖程序集的Moles

时间:2012-05-15 07:28:37

标签: moles

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

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

因此,我使用以下步骤构建了一个解决方法,以使其与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步骤中也存在相同的问题,使用与RhinoMocks相同的依赖DLL。有什么方法可以解释这个吗?

1 个答案:

答案 0 :(得分:0)

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

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