2015-10-27 82 views
0

我的grails應用程序需要連接到現有的mongodb服務器。我正在使用插件':mongodb:3.0.3'來做到這一點。我有一個域類,基本上是空的Grails Mongodb插件不保存

class Thing { 
    static mapWith = "mongo" 

    String id 
    String name 

    static constraints = { } 

    static mapping = { 
     collection "myThing" 
     id column: '_id', generator: 'assigned' 
     version false 
    } 
} 

,我試圖挽救一個新的域對象在集成測試 - 的前兆控制器動作:

def "create the thing"() { 
    def thing = new Thing(name: "name", id:"foobar") 

    when: 
    def foo = thing.save(flush: true, failOnError:true) 

    then: 
    Thing.findByName("name") 
} 

測試失敗,因爲Thing.findByName返回null,但是,當我深入低級API時,我可以保存一個對象。以下測試通過:

def "create the thing low level"() { 
    when: 
    Thing.collection.insert([name:"name"]) 

    then: 
    Thing.findByName("name") 
} 

我已經看了看其他計算器問題,他們似乎處理:

  • 不使用沖洗,對此我
  • 不具有配置設置propertly,我這樣做是因爲我已經從中獲取記錄,並且低級別的API工作。
  • 我不因爲failOnError有約束錯誤是真實的

我在做什麼錯?我如何才能使GORM保存起作用,因爲我想使用可用的grails工具。

注意:這不僅僅是一個測試問題,試圖在使用GORM的控制器中保存某些內容也不起作用。調用此動作:

def save() { 
    def thing = new Thing() 
    thing.name = "foobar" 
    respond thing.save(failOnError: true, flush: true) 
} 

返回{ "class": "com.Thing", "id": null, "name": "foobar" }並看看數據庫告訴我它沒有保存。

回答

0

您必須將此行添加到集成測試的頂部,它應該開始保存。默認情況下GORM不會持續存在甚至在IntegrationTests

static Boolean transactional = false 

你的測試將類似於下面,

class TestIntegrationSpec extends IntegrationSpec { 
    static Boolean transactional = false 

    def "my test"() { 
    ... 
    } 
    ... 
} 
+0

我補充說,行到文件的頂部,它仍然無法以同樣的方式。由於我沒有使用交易服務,也沒有自己創建交易,所以我不確定交易是如何進入等式的。據我所知,集成測試有交易,他們只是在默認情況下最終回滾。 – adeady

+0

@adeady嗯......如果我在POSTGRES中添加這行,它的工作原理和堅持db。我猜想Mongo可能會有一些差異。 –

+0

是的,postgres將沒有問題。我懷疑它是一個插件或數據庫問題 - 但互聯網似乎沒有任何其他人有這個問題,我可以找到 – adeady