У меня проблема с использованием PHPUnit с Zend_Test и фиктивными объектами. Я использую структуру Кейта Поупа, чтобы узнать о модульном тестировании. У меня есть тесты контроллера в тестах / modules / default / controllers и модульные тесты в tests / modules / default / models. Существует также подкаталог в каталоге моделей под названием TestResources, который содержит файлы, создающие фиктивные объекты.
Существует модельный модульный тест с именем Default_Model_UserTest. Он наследуется от ControllerTestCase, который имеет функцию настройки, которая используется для всех тестов. В Default_Model_UserTest дополнительная настройка заставляет тест использовать User.php в папке TestResources в качестве ресурса. Функция настройки выглядит следующим образом:
protected function setUp() {
parent::setUp();
// Replace Model Resources with TestResources
$autoloader = new Zend_Loader_Autoloader_Resource(array(
'basePath' => dirname(__FILE__),
'namespace' => 'Default'
)
);
$autoloader->addResourceType('modelResource', 'TestResources', 'Resource');
$this->object = new Default_Model_User;
}
Когда я запускаю тест самостоятельно, он корректно работает с использованием фиктивного объекта. У меня также есть тест контроллера, который проверяет, может ли пользователь проверить подлинность, который проверяет базу данных mysql. При этом запускается Default_Model_UserTest, который идет после того, как CustomerControllerTest не использует User.php в папке TestResources, но использует ресурс User.php в главном каталоге приложения, поэтому он использует базу данных mysql, а не объект mock. Я не могу понять, почему. При попытке отладки я вижу, что после запуска теста проверки подлинности он полностью игнорирует файл User.php в папке TestResources.
Если проблема связана с неправильным сбросом тестов, я добавил функцию разрыва в ControllerTestCase.php:
protected function tearDown()
{
Zend_Controller_Front::getInstance()->resetInstance();
$this->resetRequest();
$this->resetResponse();
$this->request->setPost(array());
$this->request->setQuery(array());
unset($_SERVER['DOCUMENT_ROOT']);
parent::tearDown();
}
Функция разрыва в CustomerControllerTest.php:
protected function tearDown()
{
Zend_Auth::getInstance()->clearIdentity();
Zend_Session::forgetMe();
parent::tearDown();
}
Я искал ответ везде, где мог придумать эту проблему, но ничего не могу найти. Я использую PHPUnit 3.5.11 и Zend Framework 1.11.3. Буду очень признателен, если кто-нибудь поймет, почему он так себя ведет.