摩尔斯代码可以有两种使用方式:
手动
- 包含 [assembly: MoledType(typeof(_type_to_instrument))]。
- 指定 [HostType("Moles")]。
- 调用 Microsoft.Moles.Framework.Moles.MoleRuntime.SetMole(Delegate _stub, object _receiver, MethodInfo method)。
动态
- 添加一个 {project name}.moles 文件:指定需要模拟的程序集。例如:
<Moles xmlns="http://schemas.microsoft.com/moles/2010/"> <Assembly Name="Samples.Moles"/> </Moles>
- 构建并包含对 MolesAssemblies/{project_name}.Moles.dll 的引用。
- 使用自动生成的 M{class_name} 模拟类。
我注意到使用动态程序集不需要测试项目声明“摩尔斯程序集”属性。这减少了开销,开发人员只需为每个测试方法添加摩尔斯主机类型装饰器;但进一步的测试不需要跟踪要检测的类型。
查看 molesassemblies 中的自动生成代码(使用反汇编器)很容易找到所需的仪器化属性。然而,尝试编写自己的“摩尔斯程序集”,即替换自动生成的程序集,却无法工作,并且运行时会抱怨我的类型需要被仪器化。我很好奇我错过了什么。
我注意到自动生成的摩尔斯代码声明了必要的 MoledAssembly 属性。但在我的测试中,测试项目似乎必须声明此属性;它不能由引用项目来声明。然而,在自动生成程序集的情况下,属性似乎可以被“外部”声明。这是我根据反汇编自动生成的 moles dll 所看到的推断;我找不到其他区别。然而,正如我试图解释的那样,从反汇编自动生成的 moles dll 复制所有代码(和属性),并构建我的自己的引用程序集,在运行时失败,说我没有标记所需的测试程序集以进行仪器化(即标记为 MoledAssembly)- 尽管它已经在我的引用程序集中。
-- 更新
此时(可能是由于我对我的代码缺失的理解),我感觉我们需要非常具体地说明哪个程序集有什么。假设我们有 4 个 DLL:
- Test.dll: 这是mstest项目。没有声明
MoledAssembly
。 - Moles.dll: 当在您的项目中使用
*.moles
文件时自动生成的dll。引用第四个dll(见#4)Sealed
。声明[assembly: MoledAssembly("Sealed")]
。请注意,我正在尝试在没有此dll的情况下进行手动注入 - 它仅是一个概念性参考或用于我们的讨论或故障排除。 - MyMoles.dll: 我从源代码编译的自动生成的
Moles.dll
版本。 - Sealed.dll: 包含要测试的代码。
在答案/评论/问题中,让我们按照此列表中的每个部分进行参考。
var type = typeof(M___)
,其中M___类型在Moles.dll中。这让我相信有一些执行清单规则。我需要找到这个清单。 - payo