【问题标题】:Is there a workaround for setting [HostType("Moles")] when dealing with anonymous methods in MSpec?在处理 MSpec 中的匿名方法时,是否有设置 [HostType("Moles")] 的解决方法?
【发布时间】:2012-03-30 17:59:00
【问题描述】:

我正在使用 Pex 和 Moles 进行低级单元测试,但我也在探索 MSpec 进行业务逻辑验证,并希望继续使用 Moles 以保持一致性。我认为问题在于 MSPec 使用匿名方法,因此无法应用 HostType("Moles") 属性。例如:

Because of = () =>
   employeeList = EmployeeManager.GetUsersByRoles(rolesToLoad);

It should_return_a_list_of_employees = () =>
   employeeList.ShouldNotBeNull();

我正在模拟“GetUsersByRoles”中调用的角色提供程序,当我尝试通过 MSpec 运行此测试时,我收到标准的“Moles 要求测试在检测过程中”错误,并指示添加 [ HostType("Moles")] 到我的测试方法。这里有任何解决方法或其他选项吗?

旁注:我已经下载了 MSMSpec.tt 并对其进行了修改以包含生成的 VSTests 上的属性,但我希望能够通过它自己的运行程序或 TestDriven.net 直接运行 MSpec 测试,这样我就可以得到为 BA 和企业主提供友好的输出。

【问题讨论】:

    标签: moles mspec


    【解决方案1】:

    解决方法是将匿名方法替换为非匿名方法。 Moling Mspec 基本上是不可能的。

    Moles 无法绕过匿名方法。原因是方法必须是可寻址的,才能绕道而行。匿名方法不是隐式可寻址的,因为它们是在运行时生成和引用的。简单地说,你不能通过类调用匿名方法,因为它,嗯……匿名

    Moles 手册指出,“Moles 可用于绕过任何 .NET 方法,包括密封类型中的非虚拟和静态方法。”因此,在 Moles 使用反射来识别类成员的假设下运行是一个安全的选择。任何不能通过委托、Action 或 Func 调用的东西都不能被调用。

    【讨论】:

    • 谢谢,迈克,这是一个有用的解释。我必须弄清楚是否有一个很好的模拟框架,可以很容易地与 MSpec 和 Pex/native VS 测试一起使用。
    • 遗憾的是 Moles 不适用于 mspec。有谁知道 VS 2011 中的 Microsoft Fakes 项目(包括痣功能等)是否允许它工作?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 2017-03-03
    • 2023-03-15
    • 1970-01-01
    • 2010-09-22
    • 2015-08-19
    • 1970-01-01
    相关资源
    最近更新 更多