Модульный тест Grails доменного класса (gorm) - PullRequest
1 голос
/ 13 июня 2011

Начал играть с Grails, и я хочу оценить GORM, поэтому я создал класс домена с помощью Spring Tool Suite: Client с name, vatNumber и regNumber, и тестовый класс был создан автоматически.

Код для юнит-теста, который я добавил:

package pilot1

import grails.test.*

class ClientTests extends GrailsUnitTestCase {
    protected void setUp() {
        super.setUp()
    }

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

    void testSomething() {
        def instances = []
        def myTestDomain = mockDomain(Client, instances)
        def client = new Client(name:"Test",vatNumber:"323",regNumber:"343")
        client.id =1;
        assertEquals client.name, "Test"
        client.save();
        def res = Client.findByName("Test")
        println instances
        println res
        //assertEquals 1, instances.size()
    }
}

Результаты равны [] и null! Что я сделал не так?

Кроме того, я хотел бы также увидеть SQL, сгенерированный GORM (Hibernate), за кулисами. Любая идея, как я мог бы сделать это в Grails?

Ответы [ 4 ]

2 голосов
/ 14 июня 2011

не делайте этого: client.id = 1;

save () предоставит идентификатор.

вам может потребоваться сохранить (flush: true).

просто сохраните и используйте, затем используйте идентификатор для получения.

тогда проведите тестирование.

эта ссылка может быть полезна: http://blog.springsource.com/2011/06/07/countdown-to-grails-1-4-unit-testing/

1 голос
/ 14 июня 2011

Сохранение клиента может завершиться сбоем без исключения, что объясняет, почему res равен нулю. Попробуйте следующий код ниже, чтобы понять, не удалось ли сохранить клиент и почему.

client.save()
if(client.hasErrors()){
// Saving failed, look in client.errors to see the specific reason
}
1 голос
/ 14 июня 2011

Во-первых, вы не должны оценивать сам GORM. Те, кто предоставляет Grails, берут на себя ответственность за тестирование GORM. Конечно, вы все равно не имели в виду.

Во-вторых, тестирование findBy * () обычно не касается модульных тестов. Если вам нужно протестировать findBy * (), вам нужно собрать все экземпляры ответа findBy * () и передать этот список в качестве второго аргумента mockDomain (). Вы неправильно используете mockDomain () в своем примере - вы должны указать mockDomain (), какие экземпляры нужно имитировать, чтобы получить их обратно при вызове findBy * ().

1 голос
/ 14 июня 2011

http://www.ibm.com/developerworks/java/library/j-grails10148/index.html

"Как я упоминал ранее, Grails поддерживает два основных типа тестов: модульный и интеграционный. Между ними нет синтаксической разницы - оба записываются как GroovyTestCase, используя одни и те же утверждения. Разница заключается в семантике. предназначен для тестирования класса изолированно, тогда как интеграционный тест позволяет тестировать класс в полной, работающей среде. Откровенно говоря, если вы хотите написать все свои тесты Grails как интеграционные тесты, это меня устраивает. Все команды Grails create- * генерируют соответствующие интеграционные тесты, поэтому большинство людей просто используют то, что уже есть. Как вы увидите через мгновение, для большинства вещей, которые вы хотите протестировать, требуется, чтобы вся среда была запущена и работала в любом случае, поэтому интеграционные тесты являются довольно хорошим заданием по умолчанию. "

...