Путаница с базой данных Grails - PullRequest
1 голос
/ 16 июля 2010

Я запускаю игрушечный проект с 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() оказывается равным 0.

1 тестовый класс найден в пакете 'test'

ДА 0 Процесс завершен с кодом выхода

0

Я что-то пропускаю? У меня сложилось впечатление, что этот HSQLDB был настроен для тестирования разработки, но у меня были некоторые проблемы в обеих средах (либо с этим тестом, либо с очень простым приложением).

Ответы [ 2 ]

2 голосов
/ 17 июля 2010

Используйте book.save(flush: true), потому что вызов save() регистрирует только этот объект для сохранения в спящем режиме в какой-то момент в будущем - например, в конце транзакции.

Подробнее об этом здесь: http://grails.org/doc/latest/guide/single.html#5.3.1 Сохранение и обновление

Редактировать: Я обнаружил, что 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 голос
/ 17 июля 2010

Вы используете юнит тест. Это ничего не сохранит в базу данных. Вы издеваетесь над доменом, поэтому Grails сделает что-то, чтобы он выглядел так, как будто у вас есть некоторые методы постоянства, но в базу данных ничего не входит. Если хотите, напишите интеграционный тест.

Итак, отвечая на ваш вопрос, у вас нет проблем с вашей базой данных. У вас проблемы с началом модульного тестирования.

Совет для флеша от @codescape тоже хорош.

...