【问题标题】:Confusion with Grails development database与 Grails 开发数据库混淆
【发布时间】:2011-03-17 03:42:35
【问题描述】:

我正在用Grails 盯着一个玩具项目,但我在HSQLDB 数据库方面遇到了一些麻烦。我的 DataSource.groovy 文件是默认文件:

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"
        }
    }
}

我正在运行一个简单的测试:

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())
    }
}

setUp() 方法中的book.save() 之后,我得到一个“YEAH”,但在testSomething() 方法中,books.size() 原来是0。

在包'test'中找到1个测试类

YEAH 0 进程以退出代码结束

0

我是否忽略了什么?我的印象是这个 HSQLDB 是为开发测试而设置的,但我在这两种环境中都遇到了一些问题(无论是这个测试,还是一个非常简单的应用程序。)

【问题讨论】:

    标签: grails datasource hsqldb


    【解决方案1】:

    您正在使用单元测试。它不会将任何内容保存到数据库中。您正在模拟域,因此 Grails 会做一些事情来使它看起来像您有一些可用的持久性方法,但没有任何东西进入数据库。如果需要,请编写集成测试。

    因此,在回答您的问题时,您的数据库没有问题。您在开始进行单元测试时遇到了麻烦。

    @codescape 对刷新的建议也很好。

    【讨论】:

      【解决方案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
        }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2012-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-07
        • 2016-12-20
        • 1970-01-01
        • 1970-01-01
        • 2015-02-21
        相关资源
        最近更新 更多