Как получить модульный тест для входа в приложение Zend с помощью PHPUnit - PullRequest
2 голосов
/ 28 апреля 2011

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

Я также новичок в Zend и PHPUnit.

Я настроил свой CSRF для использования только в «производстве», и я тестирую в «разработке» (или «тестировании») Env.чтобы устранить эту неприятность.

У меня есть поле в форме входа в систему «агентство», и я думаю, что это может мешать моему прогрессу (или нет) ... Я не уверен, на самом деле.Это выпадающий список с множественным выбором, обычно заполняемый массивом (из столбца enum в DB).

Вот тест, который я пытаюсь использовать, я собираюсь также оставить закомментированные строки, они показываютчто я пробовал и / или хотел бы попробовать.Метод canLoginToApp в том виде, в каком он есть, будет пройден, но я знаю, что он не входит в систему (или не слишком много тестирует), и я не получаю покрытие кода в действии login (или в классе формы входа), и не могу утверждать, чтоиметь идентификатор или что-то еще, что должно быть там, если я вошел в систему. Также, если я использую метод выше, проверьте форму входа, она не проходит с исключением запроса DOM не может.

Вот мой тест:

<?php
/**
 * Description of LoginControllerTest
 * @author rob
 */
class LoginControllerTest 
    extends ControllerTestCase
{
    protected $userModel;

    public function setUp()
    {
        parent::setUp();
        $this->userModel = new Application_Model_Users();
    }

//    public function testIndexActionShouldContainLoginForm() {
//        $this->dispatch('/login');
//        $this->assertAction('index');
//        $this->assertQueryCount('form#loginForm', 1);
//    }

    public function testGetAGoodPage()
    {
        $this->dispatch('/');
        $this->assertResponseCode(302);
    }


    public function testCanLoginToApp()
    {   
                $this->request->setMethod('POST')
                ->setPost(array(
                    'agency'    => array('3'),
                    'username'  => 'rob',
                    'password'  => 'nonenone',
                ));
       $this->dispatch('/');

        $this->assertController('index');
        $this->assertAction('index');
        $this->dispatch('/login/index');
        $this->assertResponseCode(302);
       // $this->assertTrue($this->userModel->currentUserIdentity());
       // var_dump($this->users->currentUserIdentity());
        //$this->assertQueryContentContains('<span>', 'User Name: rob');
                $data = $this->getResponse();
        //var_dump($data);
    }
}

Мое приложение всегда переводит вас в '/ login', если вы еще не вошли в систему (или, более конкретно, если 'Zend_Auth :: getInstance! = HasIdentity ()).Я хотел бы заявить, что в тесте он имеет hasIdentity.Я могу получить код «302» только на любой странице, которую получаю при тестировании, но в phpfirebug я получаю 200. Хотя я думаю, это из-за маршрутизации (zend) (?)

Messingпрошлой ночью я добавил $ data = getResponse () и выгрузил его (теперь комментарий за var_dump), var_dump продолжал, и так далее, и так далее.Выглядело так, как будто оно катится по всему приложению ... странно :) Вот небольшой фрагмент этого:

  ["_moduleControllerDirectoryName":protected]=>
                      string(11) "controllers"
                      ["_plugins":protected]=>
                      object(Zend_Controller_Plugin_Broker)#90 (3) {
                        ["_plugins":protected]=>
                        array(0) {
                        }
                        ["_request":protected]=>
                        object(Zend_Controller_Request_HttpTestCase)#76 (18) {
                          ["_headers":protected]=>
                          array(0) {
                          }
                          ["_method":protected]=>
                          string(4) "POST"
                          ["_rawBody":protected]=>
                          NULL
                          ["_validMethodTypes":protected]=>
                          array(6) {
                            [0]=>
                            string(6) "DELETE"
                            [1]=>
                            string(3) "GET"
                            [2]=>
                            string(4) "HEAD"
                            [3]=>
                            string(7) "OPTIONS"
                            [4]=>
                            string(4) "POST"
                            [5]=>
                            string(3) "PUT"
                          }
                          ["_paramSources":protected]=>
                          array(2) {
                            [0]=>
                            string(4) "_GET"
                            [1]=>
                            string(5) "_POST"
                          }
                          ["_requestUri":protected]=>
                          string(12) "/login/index"
                          ["_baseUrl":protected]=>
                          string(0) ""
                          ["_basePath":protected]=>
                          NULL
                          ["_pathInfo":protected]=>
                          string(12) "/login/index"
                          ["_params":protected]=>
                          array(3) {
                            ["controller"]=>
                            string(5) "login"
                            ["action"]=>
                            string(5) "index"
                            ["module"]=>
                            string(7) "default"
                          }
                          ["_aliases":protected]=>
                          array(0) {
                          }
                          ["_dispatched":protected]=>
                          bool(true)
                          ["_module":protected]=>
                          string(7) "default"
                          ["_moduleKey":protected]=>
                          string(6) "module"
                          ["_controller":protected]=>
                          string(5) "login"
                          ["_controllerKey":protected]=>
                          string(10) "controller"
                          ["_action":protected]=>
                          string(5) "index"
                          ["_actionKey":protected]=>
                          string(6) "action"
                        }
                        ["_response":protected]=>
                        *RECURSION*
                      }

Вот исходный вид страницы входа (как в браузере):

<h2>Login</h2>

<form id="login" enctype="application/x-www-form-urlencoded" method="post" action="/login"><dl class="zend_form">
<dt id="agency-label"><label for="agency" class="required">Agency:</label></dt>
<dd id="agency-element">
<select name="agency" id="agency">
    <option value="00003" label="Dev Agency">Dev Agency</option>
    <option value="00004" label="ISR">ISR</option>
</select></dd>
<dt id="username-label"><label for="username" class="required">Username:</label></dt>
<dd id="username-element">
<input type="text" name="username" id="username" value="" /></dd>
<dt id="password-label"><label for="password" class="required">Password:</label></dt>

<dd id="password-element">
<input type="password" name="password" id="password" value="" /></dd>
<dt id="login-label">&#160;</dt><dd id="login-element">
<input type="submit" name="login" id="login" value="Login" /></dd></dl></form></div>

    </body>
</html>

Верхняя часть страницы - это обычные метатеги заголовков (css, title и т. Д.).

Также в моем массиве 'Post' для 'agency', которое я пробовал

3
00003
'3'
'00003'
'Dev Agency'
array('00003' => 'Dev Agency')
array('3')
array(3)
array(00003)

Я также пробовал $ this-> dispatch ('/'), ('/ login'), ('index') и, возможно, пару других тоже.Я не уверен, что на самом деле очень важно протестировать мой логин, но я хотел бы быть в состоянии это сделать, и я думаю, чтобы протестировать часть своего кода, я должен войти в систему или, по крайней мере, получить 'hasIdentity '= true от Zend_Auth, так как я много проверяю это в приложении.Я предпочитаю отдавать «поддельный» объект Auth из теста.

В качестве стороннего или расширенного вопроса: «Делает ли Zend Framework что-то внутренне в тестировании ENV, или это полностью моя собственная среда?»сделано вне соглашения (конечно, доступно для меня, чтобы использовать)?Обращает ли какая-либо часть ZF внимание на окружающую среду по этому вопросу (производство, тестирование, разработка, подготовка)?Я спрашиваю, потому что я также попробовал некоторое тестирование в env 'testing'.думая, что диспетчер или маршрутизатор могут вести себя немного иначе в тестовой среде.(перенаправления, ответ, запрос и т. д.).

Спасибо

Ответы [ 2 ]

2 голосов
/ 29 апреля 2011

Если вы хотите тестировать, вы должны иметь доступ к Zend_Auth, как обычно, и тестировать его.Например,

// after correct login there should be zend_auth identity setup 
$auth = Zend_Auth::getInstance();
$this->assertTrue($auth->hasIdentity());
1 голос
/ 28 апреля 2011

ENV 'testing' просто загружает блок тестирования в ваш application.ini с конкретными настройками. Для прохождения теста с кодом ответа это довольно сложно, вам нужно вернуть перенаправление, как объяснено здесь

return $this->_redirect("/");

И для выполнения вашего закомментированного блока кода вам нужно переключить запрос и сделать еще один:

//[...]
$this->resetRequest();
$this->resetResponse();
$this->dispatch("/");

А затем ваш код подтверждения:

   $this->assertTrue($this->userModel->currentUserIdentity());
   var_dump($this->users->currentUserIdentity());
   $this->assertQueryContentContains('<span>', 'User Name: rob');

примечание: для проверки userIdentity вам не нужно делать еще один GET-запрос, потому что хранилище аутентификации (я полагаю) заполняется, когда вы POST-данные в контроллер. Тем не менее, это ваше дело, чтобы организовать его лучше

примечание 2: вместо проверки кода ответа попробуйте использовать метод assertRedirect ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...