【发布时间】: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