痣可以通过两种方式使用:
手动
- 包括【装配:MoleType(typeof(_type_to_instrument))】
- 指定 [HostType("Moles")]
- 调用 Microsoft.Moles.Framework.Moles.MoleRuntime.SetMole(Delegate _stub, object _receiver, MethodInfo 方法);
动态地
- 添加一个 {project name}.moles 文件:将程序集指定为 mole。例如
<Moles xmlns="http://schemas.microsoft.com/moles/2010/"> <Assembly Name="Samples.Moles"/> </Moles>
- 构建并包含对 MolesAssemblies/{project_name}.Moles.dll 的引用
- 使用 M{class_name} 自动生成的鼹鼠类。
我注意到的是,使用动态程序集不需要测试项目声明“moled 程序集”属性。这减少了开销,开发人员只需要使用主机类型来装饰每个测试方法。但进一步的测试不需要跟踪要检测的类型。
查看 molesassemblies 中自动生成的代码(使用反汇编程序),很容易找到所需的检测属性。但是,尝试编写我自己的“mole 程序集”,基本上替换自动生成的程序集,并不起作用,并且运行时抱怨我的类型需要被检测。我很好奇我错过了什么。
我注意到自动生成的 moles 代码声明了必要的 MoledAssembly 属性。但是在我的测试中,测试项目似乎要声明这个属性;它不能由项目的引用程序集声明。但是,在使用自动生成的程序集的情况下,它似乎可以将属性声明为“外部”。这是我基于反汇编自动生成的 moles dll 所看到的假设;我找不到任何其他区别。但是,正如我试图解释的那样,从反汇编的自动生成的 moles dll 中复制所有代码(和属性)并构建我自己的引用程序集在运行时失败,说我没有标记需要检测的测试中的程序集(即标有 MoledAssembly) - 只是在我引用的程序集中。
- 更新
在这一点上(可能是由于我误解了我的代码缺少什么)我觉得我们需要非常具体地了解哪些程序集有什么。假设我们有 4 个 dll:
- Test.dll:mstest 项目。不声明
MoledAssembly
。 - Moles.dll:
*.moles
在项目中使用文件时创建的自动生成的 dll。引用第 4 个 dll,(参见 #4)Sealed
。声明[assembly: MoledAssembly("Sealed")]
。请注意,我正在尝试在没有此 dll 的情况下完成手动痣注入 - 它只是一个概念参考或用于我们的讨论或故障排除。 - MyMoles.dll:我从源代码编译的自动生成的
Moles.dll
. - Sealed.dll:包含被测代码。
在答案/评论/问题中 - 让我们根据此列表参考每个部分。