Обработчик Zend Session Handler Db разрушается во время теста PHPUnit

Я выполнял модульное тестирование, и я столкнулся с этой странной плохой проблемой.

Я выполняю тесты аутентификации пользователей с некоторыми из моих сервисов /mappers.

Сейчас я запускаю около 307 тестов. Это происходит только тогда, когда я запускаю их все в одной партии.

Я пытаюсь создать экземпляр только одного объекта Zend_Application и использовать его для всех моих тестов. Я только создаю экземпляр, чтобы заботиться о подключении db, сеансе и автозагрузке моих классов.

Вот проблема.

Где-то вдоль линии тестов вызывается метод __destruct для Zend_Session_SaveHandler_DbTable. Я не имею понятия почему? Но это так.

Метод __destruct сделает любую запись для моих объектов сеанса бесполезной, поскольку они помечены как доступные только для чтения.

У меня нет понятия, почему вызывается метод destruct.

Он получает много тестов перед моими проверками подлинности. Если я запускаю каждую папку тестов отдельно, проблем нет. Это только когда я пытаюсь запустить все 307 тестов. У меня есть некоторые тесты, которые работают с базой данных, но мой код не закрывает соединения db или не разрушает обработчик сохранения.

Есть ли у кого-нибудь идеи о том, почему это происходит, и почему мой Zend_Session_SaveHandler_DbTable разрушается? Имеет ли это какое-либо отношение к времени жизни, которое оно имеет по умолчанию?

2 ответа

Я думаю, что произошло то, что PHPUnit делал сборку мусора. Всякий раз, когда я запускал тесты 307, сборщик мусора должен был работать, и по какой-то причине он, вероятно, уничтожил Zend_Session_SaveHandler_DbTable.

Это объясняет, почему он не уничтожился, когда было запущено меньше тестов.

Или, может быть, это был PHP, делающий сборку мусора, что имеет больше смысла.

В любом случае, моим текущим решением является создание нового объекта Zend_Application для каждого тестового класса, чтобы все тесты внутри этого класса имели новый объект zend_application для работы.

Вот интересная информация.

Я помещаю оператор эха в метод __destruct обработчика save.

Метод вызывался (X + 1) раз, где X было числом тестов, которые я запускал. Если я проведу 50 тестов, я получил 51 эхо, 307 тестов, затем 308 эхо и т.д.

Вот интересная часть. Если бы я провел всего несколько тестов, эхо все бы пришли к КОНЕЦ тестового прогона. Если бы я попытался запустить все 307 тестов, 90 эхо-сигналов появятся после того, как я предположил, что это 90 тестов. Остальные эхо-сигналы затем появятся в конце оставшихся тестов. Число эхо-сигналов снова было X + 1, или в этом случае 308.

Итак, я предполагаю, что это имеет какое-то отношение к методу tearDown, который вызывает PHPUnit, или сборщику мусора PHP. Возможно, PHPUnit вызывает сборщик мусора при разрыве. Кто знает, но я рад, что теперь у меня это работает, так как мои тесты проходили заранее.

Если у кого-то из вас есть лучшее решение, дайте мне знать. Возможно, я обнаружил недостаток в моем коде, phpunit или zend, который ранее не был известен, и есть способ исправить его.


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

Zend_Session::$_unitTestEnabled = true;

licensed under cc by-sa 3.0 with attribution.