2017-08-09 57 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