2010-07-16 134 views
1

我正在盯着一個玩具項目Grails,但我在HSQLDB數據庫方面遇到了一些麻煩。我DataSource.groovy文件中是默認的:與Grails開發數據庫混淆

environments { 
    development { 
     dataSource { 
      dbCreate = "create-drop" // one of 'create', 'create-drop','update' 
      url = "jdbc:hsqldb:mem:devDB" 
      loggingSql = true 
     } 
    } 
    test { 
     dataSource { 
      dbCreate = "update" 
      url = "jdbc:hsqldb:mem:testDb" 
      loggingSql = true 
     } 
    } 
    production { 
     dataSource { 
      dbCreate = "update" 
      url = "jdbc:hsqldb:file:prodDb;shutdown=true" 
     } 
    } 
} 

而且我運行一個簡單的測試:在setUp()方法

class BookTests extends GrailsUnitTestCase { 
    protected void setUp() { 
     super.setUp() 

     mockDomain (Book) 
     def book = new Book ("The shinning","Some guy who wrote it") 
     if (book.save()){ 
      println ("YEAH") 
     } 
     else{ 
      print ("AWWWWHH") 
     } 
    } 

    protected void tearDown() { 
     super.tearDown() 
    } 

    void testSomething() { 
     def books = Book.getAll() 
     print (books.size()) 
    } 
} 

book.save()後,我收到了「YEAH」,但在該testSomething()方法,所述books.size()原來是0

1測試類在包中發現「測試」

YEAH 0進程退出代碼爲

我俯瞰的東西吃完了嗎?我的印象是這個HSQLDB是爲開發測試設置的,但我在兩種環境中都遇到了一些麻煩(無論是用這個測試還是用一個非常簡單的應用程序)。

回答

2

使用book.save(flush: true),因爲只調用save()註冊這個對象,在將來的某個時刻通過休眠來保存 - 例如在事務結束時。

瞭解更多關於此這裏:http://grails.org/doc/latest/guide/single.html#5.3.1 Saving and Updating

編輯:我發現grails.test.MockUtils.groovy被錯誤地實施了GETALL()。沒有實現可以正確處理無參數調用。你可以通過簡單的修復來克服這個問題。請參閱附加示例:

package sandbox 

import grails.test.* 

class BookTests extends GrailsUnitTestCase { 

    protected void setUp() { 
    super.setUp() 
    // test data setup 
    def bookInstances = [ 
      new Book(title: "Grails", author: "Graeme"), 
      new Book(title: "Spring", author: "Rod") 
    ] 
    mockDomain Book, bookInstances 
    new Book(title: "The shinning", author: "Some guy who wrote it").save(flush: true) 

    // fixing parameterless getAll() behaviour through delegating to findAll() 
    registerMetaClass Book 
    Book.metaClass.'static'.getAll = {-> Book.findAll() } 
    } 

    protected void tearDown() { 
    super.tearDown() 
    } 

    void testSomething() { 
    assert Book.getAll().size() == 3 
    assert Book.findAll().size() == 3 
    } 

} 
1

您正在使用單元測試。它不會將任何內容保存到數據庫中。你在嘲笑域名,所以Grails會做一些事情,讓它看起來像你有一些持久化方法可用,但沒有任何數據庫。如果你想要的話,寫一個集成測試。

所以在回答你的問題時,你沒有遇到數據庫問題。開始進行單元測試時遇到問題。

@codescape的刷新建議也不錯。