2017-08-09 27 views
0

我有一个创建,像这样的可选参数条件查询一个Grails服务:测试标准建立在一个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和标准物体之间的相互作用断言。

我缺少什么?

+0

您应该使用一个集成测试 –

+0

你真的不希望测试标准是否奏效......您想测试您制作的标准是否会找到您想要的。创建一些假汽车,然后通过传递一些参数来运行该方法,并查看是否有正确的汽车结果。 – billjamesdev

+0

@billjamesdev这听起来很奇怪。通过做一个实际的查询并执行它,我实际上正在测试标准类,而我想测试的是该对象被正确创建并且预期的方法被调用。我实际上正在寻找一种方法来避免完整的集成测试,因为这种逻辑不依赖于持久层。 – Raibaz

回答

1

Grails的查询在哪里,而不是标准的查询似乎是更好的选择的惯用方式在Grails中做到这一点:

Gorm Where Query