Grails.смоделированные данные из модульного теста доступны в интеграционном тесте - PullRequest
0 голосов
/ 21 мая 2011

У меня не пройден интеграционный тест из-за загрязнения теста (тесты проходят или не проходят в зависимости от того, в каком порядке они выполняются).

Что меня немного смущает, так это то, что кажется, что модульный тест, в котором я смоделировал некоторые данные с помощью mockDomain(Media.class,[new Movie(...)]), все еще присутствует и доступен в других тестах, даже в интеграционных тестах.

Это ожидаемое поведение? почему тестовая структура не очищает после себя для каждого теста?

EDIT

Действительно странно, в документации говорится, что:

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

Однако в моем интеграционном тесте у меня есть следующий код

    protected void setUp() {
      super.setUp()
      assertEquals("TEST POLLUTION!",0,Movie.count())
      ...
    }

Что дает мне вывод:

TEST POLLUTION! expected:<0> but was:<1>

Это означает, что есть данные, которых не должно быть!

Глядя на данные, присутствующие в Movie.list (), я обнаруживаю, что данные соответствуют данным, установленным в предыдущем тесте (модульном тесте)

protected void setUp() {
    super.setUp()

    //mock the superclass and subclasses as instances
    mockDomain(Media.class,[
            new Movie(id:1,name:'testMovie')
    ])
    ...
}

Есть идеи, почему я испытываю эти проблемы?

1 Ответ

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

Также возможно, что загрязнение находится в тестовой базе данных. Проверьте DataSources.groovy, чтобы увидеть, что используется в тестовой среде. Если он настроен на использование базы данных, где dbCreate имеет значение, отличное от "create-drop", также может отображаться любое предыдущее содержимое базы данных.

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

Мы столкнулись с этой проблемой, так как для нашей тестовой среды было установлено dbCreate как "update". Почему это было установлено для интеграционных тестов, меня озадачило, поэтому я перешел на использование dbCreate в качестве "create-drop" и убедился, что при запуске комплектов тестов мы начинали с чистой базы данных.

...