代码之家  ›  专栏  ›  技术社区  ›  Tom

与Grails开发数据库混淆

  •  1
  • Tom  · 技术社区  · 15 年前

    我正在着手一个玩具项目 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())
        }
    }
    

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

    在包“test”中找到1个测试类

    是的,0进程已完成,退出代码为

    2 回复  |  直到 5 年前
        1
  •  2
  •   stefanglase    15 年前

    使用 book.save(flush: true) save() 只注册这个对象以便在将来的某个时候由hibernate保存—例如在事务结束时。

    http://grails.org/doc/latest/guide/single.html#5.3.1 Saving and Updating

    编辑: 我发现getAll()的grails.test.MockUtils.groovy实现不正确。没有正确处理无参数调用的实现。你可以通过一个简单的修复来克服这个问题。见随附样品:

    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
      }
    
    }
    
        2
  •  1
  •   Peter Mortensen Pieter Jan Bonestroo    15 年前

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

    对于flush by@codescape的建议也很好。

    推荐文章