Несовместимые юнит-тесты - ошибка набора тестов, прохождение разделено - PullRequest
1 голос
/ 15 марта 2011

У меня есть модульные тесты для контроллеров Zend Framework, расширяющие Zend_Test_PHPUnit_ControllerTestCase.

Тесты отправляют действие, которое переходит к другому действию, например:

// AdminControllerTest.php

public testAdminAction()    
   $this->dispath('/admin/index/index');
   // forwards to login page
   $this->assertModule('user');
   $this->assertController('profile');
   $this->assertController('login');
   $this->assertResponseCode(401);
}

// NewsControllerTest.php

public testIndexAction()
{
     $this->dispatch('/news/index/index');
     $this->assertModule('news');
     $this->assertController('index');
     $this->assertController('index');
     $this->assertResponseCode(200);

}

Оба теста проходят, когда они выполняются как отдельные тесты.
Когда я запускаю их в одном и том же наборе тестов, второй отказывает.
Вместо отправки /news/index/index отправляется предыдущий запрос(пользовательский модуль).

Как отследить эту ошибку?Похоже, у меня есть какое-то глобальное состояние где-то в приложении, но я не могу отладить это.Как я могу сбросить объекты между тестами в комплекте?setUpBefore/AfterClass являются статическими, поэтому данных об экземплярах объекта не так много.

Я знаю, что это своего рода угадайте, какой вопрос.Здесь трудно предоставить надежные данные, потому что они заняли бы много места, поэтому не стесняйтесь спрашивать подробности.

Вся установка модульного теста более или менее похожа на описанную в: Тестирование Zend Framework MVCПриложения - phly, boy, phly или Тестирование контроллеров Zend Framework «Federico Cargnelutti .

Решение:

Я определил проблему (после небольшой дремоты)).Проблема была не в настройке модульного теста, а в проверенном коде.

Я использую различные объекты ACL на основе имени модуля.Какой из них использовать, было определено статическим помощником призыва к действию, который кэшировал результат в закрытой статической переменной, чтобы ускорить процесс.Этот кеш был выполнен только при запуске в тестовом наборе.Мне просто нужно больше юнит-тестов для этого кода:)

(извините за такой мусорный пост, но я придерживался этого в течение дня, и я надеялся, что кто-то еще испытывал подобный вид этого гейзенбаг сюнит тесты в целом)

1 Ответ

1 голос
/ 15 марта 2011

Вы можете попробовать очистить объекты request и response перед отправкой каждого действия, например:

$this->resetRequest()
     ->resetResponse()
     ->dispatch('/news/index/index');
...