2014-07-04 51 views
2

我打算測試一個where query,但它總是返回一個空列表。如果我刪除owner.name == "Jane"查詢返回一些內容,但是當我將它放回去時,它不會再返回任何東西。 where查詢絕對適用於測試應用程序的基本模型搜索,但是,我不確定它是否在包含關聯時起作用。它在run-app上運行正常,但它似乎在測試應用程序上失敗。難道我做錯了什麼?我需要嘲笑一些東西嗎?我正在使用grails 2.3.9和spock。注意:我在做單元測試。在grails中,我該如何測試關聯的查詢?

Owner owner = Owner.build(name: "Jane") 
Pet expectedPet = Pet.build(breed: "Random dog", owner:owner) 

when: 
def pets = Pet.where { 
      breed == "Random dog" && owner.name == "Jane" 
}.list() 

then: 
pets.size() == 1 

回答

2

但是,我能夠將您的測試通過我自己的域名。我的假設是,您的域中可能有其他字段導致save失敗。我的建議是使用buildWithoutSave並用failOnError:true自己保存以進一步調試。

希望它可以幫助

//規格:

import grails.buildtestdata.mixin.Build 
import spock.lang.Specification 

@Build([Owner, Pet]) 
class OwnerSpec extends Specification { 

    def setup() { 
    } 

    def cleanup() { 
    } 

    void "test something"() { 
     setup: 

     //Owner owner = Owner.build(name: "Jane") 
     //Pet expectedPet = Pet.build(breed: "Random dog", owner: owner) 

     Owner owner = Owner.buildWithoutSave(name: "Jane") 
     owner.save(failOnError: true) 

     Pet expectedPet = Pet.buildWithoutSave(breed: "Random dog", owner: owner)   
     expectedPet.save(failOnError: true) 

     when: 
     def pets = Pet.where { 
      breed == "Random dog" && owner.name == "Jane" 
     }.list() 

     then: 
     pets.size() == 1 
    } 
} 

//域

class Pet { 

    String breed 
    testsave.Owner owner 

    static constraints = { 
    } 
} 

class Owner { 
    String name 

    static constraints = { 
    } 
} 
+0

是啊,我的老闆對象的方式比我透露了更多的複雜。它有幾個指向其他對象的字段。我想知道我是否應該嘲笑「where」子句的返回值來解決這個問題,但我想這會打敗測試的目的。我的服務btw中有「where子句」,如果這很重要的話。 :( – user3744677

+0

從更大的角度來看,目前的測試實際上是測試Grails和構建測試數據的功能,我不會擔心測試它們的問題,正如你所說的可能關注核心業務和嘲笑不必要的過程是更好的方法,除非有一些業務邏輯或與應用程序相關的邏輯在測試中 – Alidad

+0

是的,我只是在測試它,因爲where子句沒有返回任何東西,我想親自看看where子句是否在測試,我想知道,你知道如何模擬查詢?我試圖做metaClass的東西,但它不工作..你認爲,像'Pet.where()>> expectedPets'應該工作?我不認爲where子句是一個方法,但我會試試看,當我回家。編輯:我甚至不知道它是一種方法,封閉或什麼。 – user3744677