【问题标题】:mocking the return value of domainInstance.validate()模拟 domainInstance.validate() 的返回值
【发布时间】:2011-01-18 12:34:32
【问题描述】:

我正在编写一个 spock 单元测试来测试控制器方法。

被测控制器操作实例化一个新的域实例对象,并且 在保存之前调用 validate 。 有没有嘲笑对 domainInstance.validate() 的调用所以我 可以让它返回我想要的任何东西吗?还是我必须隐藏这个 实现这一点的服务方法背后的实例化和保存?

我这样做是因为在单元测试的上下文中 控制器,不应涉及域对象的约束。 我在其他地方进行了测试(显然是在 MyDomainClassTests 中)。如果我 想将这些考虑在内 我的测试将是一个集成 测试。

【问题讨论】:

    标签: unit-testing grails mocking spock


    【解决方案1】:

    如果您没有将验证放在域实例本身上,而是放在服务中, 你可以让你的控制器在它的构造函数(或者更确切地说是一个服务的接口)中接受一个服务。让该服务处理验证。

    现在,对于该控制器的单元测试,您需要将该接口(服务)的 Mock 传递给控制器​​,并将该模拟配置为返回您想要的任何内容。

    对于 .net,我可以推荐起订量 (http://code.google.com/p/moq/)

    【讨论】:

    • 嗯,是的,这是我在编写“或者我是否必须隐藏这个实例并保存在服务方法后面才能实现这一点?”时建议的替代解决方案?问题是我会绕过核心 grails 功能,有点违背框架的精神
    • 是的,我没有看到标签(要么我因为某种原因而失明咳嗽,要么你只是添加了它们——我希望是后者)。如果您无法删除对验证的依赖,那么您将陷入困境。一些模拟框架可能想知道 - 你尝试过 TypeMock Isolator 吗?
    • (编辑:TypeMock 适用于 .net 和 c++,但我不知道 grails/java 是否有类似的替代品?)
    • 抱歉,我认为标签已经在那里了 :) 无论如何,是的,有一堆用于 groovy/grails 的测试框架,其中一个我正在使用(Spock)我没有与他们有很多经验,过去几年我一直在 Java/mockito 阵营。
    • 顺便说一句,如果您可以在此处添加“spock”​​标签,那就太好了。以我的分数我还不能添加不存在的标签:)
    【解决方案2】:

    一段时间后,我得出结论,我想要的东西相当棘手。如果您处于没有必须使用mockDomain() 的场景中,您可以添加一个 groovy 元类方法及其实现(返回 true 或 false,随心所欲)

    如果您确实需要 mockDomain(),因为您需要模拟预先存在的实例,那么您就没有选择了,至少现在是因为 mockDomain() 和摆弄 mockDomain 实际提供的元类方法会不要混合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-15
      • 1970-01-01
      • 1970-01-01
      • 2022-11-07
      • 2013-10-15
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多