Модульное тестирование Zend Controller просто выходит - PullRequest
2 голосов
/ 02 апреля 2012

Итак, у меня есть класс юнит-теста:

class HomeControllerTest extends ControllerTestCase
{
    public function testLoginAction()
    {
        $this->dispatch('/home/login');
        $this->assertController('home');
        $this->assertAction('login');
        $this->assertQueryCount('div.login', 1);
    }

    public function testProcessloginAction()
    {
        $this->getRequest()
        ->setMethod('POST')
        ->setPost(array("username" => "example@example.com",
                                       "password" => "password"));
        $this->dispatch('/home/processlogin');

        $session = new Zend_Session_Namespace('session');
        $this->assertEquals($session->isLoggedIn, true);
        $this->assertRedirectTo('/home');
    }
}

И это результат теста:

root@ubuntu:/mnt/hgfs/app# phpunit --stderr
PHPUnit 3.5.15 by Sebastian Bergmann.

.root@ubuntu:/mnt/hgfs/app#

Первый тест работает нормально, однако второй тест просто завершается непосредственно перед отправкой $ this-> ('/ home / processlogin'); линия. Я не знаю почему, но единственное, что я вижу, это то, что home / processlogin выполняет перенаправление.

Кто-нибудь испытывал это с ZF 1.11.x (тест против 1.11.7 и 1.11.11)?

Ответы [ 3 ]

1 голос
/ 03 апреля 2012

Было бы полезно, если бы вы могли показать нам код действия processlogin.

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

0 голосов
/ 02 июля 2012

Внутри Zend Framework вызывает exit; после установки заголовков для перенаправления.

Однако при запуске через тестовые примеры Zend Controller платформа отключает это exit; и позволяет вызывающему коду (например, тестовому примеру) продолжать выполнение.

Вам нужно разобраться с двумя ситуациями:

1. Фактического перенаправления нет.

Поскольку страница на самом деле не перенаправлена, вы должны использовать тестовый метод assertRedirectTo():

утверждают, что произошло перенаправление, и что значение В качестве заголовка местоположения указывается $ url.

public function testRedirectHeadersSent()
{
    $this->dispatch('/user');
    $this->assertRedirectTo('/user/view');
}

2. Действие не завершается при перенаправлении.

Чтобы остановить выполнение кода внутри действия, необходимо убедиться, что вы вернулись из действия при перенаправлении:

public function userAction()
{
    // ... Some code
    return $this->getHelper('Redirector')->goToRoute(array ('id' => $id), 'userView');

    // ... Will no longer execute the following:
    var_dump("Never gets here");
}
0 голосов
/ 04 апреля 2012

Одна проблема, с которой я столкнулся при тестировании перенаправлений в Zend Framework, заключается в том, что они часто терпят неудачу, если перенаправление не завершается должным образом.Похоже, что это не влияет на перенаправление в браузере, но вызывает сбой при запуске кода через PHPUnit на CLI.

Вместо использования:

$this->_redirect('home');

Попробуйте вернуть перенаправление так, чтобычто он корректно завершает действие:

return $this->_redirect('home');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...