【问题标题】:Testing criteria creation in a Grails service在 Grails 服务中创建测试标准
【发布时间】:2018-01-17 07:30:03
【问题描述】:

我有一个 Grails 服务,它使用如下可选参数创建条件查询:

List<Car> search(String make = "%", String model = "%", Integer year = null) {
    def c = Car.createCriteria()

    return c.list() {
        if(make) {
            like("make", make)
        }
        if(model) {
            like("model", model)
        }
        if(year) {
            eq("year", year)
        }
    }
}

(另外,这是在 grails 中执行此操作的惯用方式吗?我对框架很陌生,我正在尝试找到正确的做事方式)

我想测试是否根据search 方法的参数值设置了正确的条件过滤器,但我没有成功。

我尝试了一些变体:

@TestFor(CarService)
@Mock(Car)
class CarServiceSpec extends Specification {
    def car = Mock(Car)
    void "empty filters"() {
        when: service.search()
        then:
        with(car.createCriteria()) {
            0 * like(*_)
            0 * eq(*_)
        }
    }
}

但我似乎无法找到一种方法来断言 CarService 和条件对象之间的交互。

我错过了什么?

【问题讨论】:

  • 你应该使用集成测试
  • 您并不想测试标准是否有效……您想测试您建立的标准是否能找到您想要的。创建一些假 Cars,然后通过传入一些参数运行该方法,并查看正确的 Cars 结果。
  • @billjamesdev 这听起来很奇怪。通过执行实际查询并执行它,我实际上是在测试条件类,而我想要测试的是对象是否正确创建并且在其上调用了预期的方法。我实际上是在寻找一种方法来避免全面的集成测试,因为这种逻辑不依赖于持久层。
  • @Raibaz 如果您正确构建测试输入,您的结果应该显示您是否正确构建了标准,您不需要看到每个单独的内部调用发生。请注意,您还有不必要的条件(或默认值)。如果默认值为“%”,则不需要条件包装器,反之亦然。

标签: unit-testing grails groovy spock


【解决方案1】:

Grails Where 查询而不是 Criteria 查询似乎是在 Grails 中执行此操作的惯用方式的更好选择:

Gorm Where Query

【讨论】:

    猜你喜欢
    • 2013-01-22
    • 1970-01-01
    • 2023-03-13
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多