2016-02-24 2 views
0

Мне было интересно, как создать мир объектов класса Domain для использования в моих модульных тестах. Какой лучший подход?Как заполнить классы домена в Grails 3 для модульных тестов

Скажи это мой код, ServiceX:

List<Course> getAllCoursesByType(String type) { 
     List<Course> list = Course.findAllByType(type) 
     list 
    } 

Это испытание для ServiceX:

import grails.buildtestdata.mixin.Build 
import grails.test.mixin.TestFor 
import grails.test.mixin.Mock 
import spock.lang.Specification 


    @TestFor(ServiceX) 

    class ServiceXSpec extends Specification { 

     void "get all open courses"() { 
     given: 
     String type = "open" 
     when: 
     def list = service.getAllCoursesByType(type) 

     then: 
     list.size() == 4 
    } 

} 

Как я могу "предварительно заполнены в" тест-дб (память) сеют, что я на самом деле есть 4 таких объекта в списке?

ответ

0

Оказывается, вы можете добавлять/методы переопределения для классов предметной области (например), что-то вроде этого:

import grails.buildtestdata.mixin.Build 
import grails.test.mixin.TestFor 
import grails.test.mixin.Mock 
import spock.lang.Specification 
import grails.test.mixin.Mock 


@Mock([Course]) 
@TestFor(ServiceX) 

class ServiceXSpec extends Specification { 

    void "get all open courses"() { 
    given: 
    String type = "open" 

    Course.metaclass.static.findAllByType = { String type -> [new Course()]} 
    when: 
    def list = service.getAllCoursesByType(type) 

    then: 
    list.size() == 1 
} 

}

1

Создайте для этого интеграционный тест. См. Пример here.

+0

Спасибо, так вы говорите, что большинство услуг должны быть проверены с помощью интеграционные тесты? Есть ли способ издеваться над этим? Т.е. издевайтесь над этим: Course.findAllByType (type) – Jojje

+1

Если вы спросите меня, я скажу, что любой тест, который использует базу данных, не является модулем, а тестом интеграции. –

0

Это призыв к суждению, когда нужно протестировать с помощью теста медленной интеграции. Ключ должен проверить ваш код, а не код DB Grails/hibernate.

Тестирование на интеграцию не требуется для основной части тестирования службы. Я думаю, вам нужен интеграционный тест для взаимодействия объектов в запущенной системе с реальной БД. Я имею тенденцию делать это в тестах GUI с использованием GEB. Эти тесты обычно охватывают основные сквозные сценарии. Это проверяет серверную часть и взаимодействие графического интерфейса с сервером.

В тестах GUI/GEB я не проверяю все перестановки и краевые условия службы. Я выполняю большую часть этого тестирования края в модульных тестах.

Я обнаружил, что с помощью Grails, если одно одно действие DB работает в тесте интеграции, тогда работает большинство других простых действий DB. Домен Grails домена для save(), delete() и т. Д. Довольно хорошо имитирует «реальные» действия DB. Примечание: они работают с объектами в памяти, поэтому это не совсем то же самое.

Я не использую Спока, но с JUnit я использую этот подход (по-прежнему работает с Grails 3):

@TestFor(ServiceX) 
@Mock([Course]) 
class ServiceXTests { 
} 

@Test 
void testXYZ() { 
    def course= new Course(course: 'ABC') 
    assert course.save() 
    . . . 
} 

Это, как представляется, поддерживается Спока. Я бы предположил, что это создание записей домена принадлежит в разделе «Спок». Также см. Grails Testing.

Другим важным ресурсом является поиск источника Grails на Github. Я многому научился из их примеров.

Смежные вопросы