Zend Framework 1.11, Doctrine2 - Как тестировать контроллеры без сброса в базу данных - PullRequest
2 голосов
/ 21 февраля 2012

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

Например, скажем, у меня есть следующее гипотетическое действие в моем контроллере.

public function redirectUserAction() {
    $registry = Zend_Registry::getInstance();
    $em = $registry->entitymanager;
    $user = $em->getRepository('Application_Model_User')
               ->findOneBy(array('email' => 'test@test.com'));
    if(is_object($user)) {
        $this->_redirect('/');
    }
}

Я хочу проверить, что если есть пользователь, имеющий адрес электронной почты test@test.com, он будет перенаправлен на /, поэтому в данный момент у меня есть следующий тест.

public function testUserAvaliableShouldRedirectIndex() {
    $registry = Zend_Registry::getInstance();
    $em = $registry->entitymanager;
    $user = new Application_Model_User();
    $user->setEmail('test@test.com');
    $em->persist($user);
    $em->flush();
    $this->dispatch('/index/redirect-user');
    $this->assertRedirectTo('/'); 
    $em->remove($user);
    $em->flush(); 
}

Мне кажется, это очень грязный способ написания тестов. У меня сложилось впечатление, что с доктриной мне не нужно было бы на самом деле сбрасывать данные в базу данных, потому что мои объекты будут храниться в слое постоянства, но в настоящий момент мои тесты не проходят без очистки.

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

Спасибо

1 Ответ

1 голос
/ 21 февраля 2012

Вместо создания и удаления пользователя в testUserAvaliableShouldRedirectIndex() вы можете использовать setUp() и tearDown() для создания и удаления пользователя.Таким образом, вы можете использовать этого пользователя во всех действиях, которые ожидают существующего пользователя, например, redirectUserAction(), loginAction() и т. Д., Вместо того, чтобы выполнять то, что вы в настоящее время делаете для каждого из этих действий.

...