Я пытаюсь проверить мой контроллер входа, я прочитал много сообщений и попытался, что показано в ZF ref. руководство также, все еще имея проблемы.
Я также новичок в Zend и PHPUnit.
Я установил, что CSRF используется только в «производстве», и я тестирую в «разработке» (или «тестировании») Env. для устранения этих хлопот.
У меня есть поле в моем агентстве регистрации «агентство», и я думаю, что это может помешать моему прогрессу (или нет) … На самом деле я не уверен. Это всплывающее меню с несколькими выборами, обычно заполняемое массивом (из столбца перечисления в БД).
Вот тест, который я пытаюсь использовать, я собираюсь оставить прокомментированные строки тоже, они показывают, что я пробовал, и / или хотели бы попробовать. Метод canLoginToApp, поскольку он пройдет, но я знаю, что он не входит в систему (или не тестирует много), и я не получаю покрытие кода в действии входа (или в форме формы входа), и не могу утверждать, что я иметь личность или что-то еще, что должно быть там, если я вошел в систему. Также, если я использую вышеописанный метод, проверьте для формы входа в систему, что не удается выполнить запрос 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) маршрутизации (?)
Посылая эту прошлую ночь, я добавил $ data = getResponse () и сбросил ее (var_dump закомментировал сейчас), var_dump продолжался, и дальше, и дальше. Похоже, что он прокатился по всему приложению … wierd 🙂 Вот небольшой фрагмент этого:
["_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"> </dt><dd id="login-element"> <input type="submit" name="login" id="login" value="Login" /></dd></dl></form></div> </body> </html>
Верхняя часть страницы – это обычные метатеги (css, title и т. Д.).
Также в моем массиве «Почта», для «агентства» я попытался
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 чем-либо внутренне, когда в тестировании ENV», или это полностью моя собственная среда, сделанная из конвенции (конечно, доступная мне для использования)? Занимает ли какая-либо часть ZF окружающую среду (производство, тестирование, разработка, постановка)? Я спрашиваю, потому что я также пробовал некоторое тестирование в «тестировании» env. думая, что отправка или маршрутизатор могут вести себя немного иначе в тестовом env. (перенаправление, ответ, запрос и т. д.).
благодаря
Если вы хотите проверить, вы должны иметь доступ к Zend_Auth, как обычно, и тестировать его. Например
// after correct login there should be zend_auth identity setup $auth = Zend_Auth::getInstance(); $this->assertTrue($auth->hasIdentity());
ENV «тестирование» просто загружает блок тестирования в 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');
Примечание. Для проверки пользовательского идентификатора вам не нужно выполнять другой запрос GET, потому что хранилище аутентификации (я полагаю) заполняется, когда вы отправляете данные контроллеру. Тем не менее, это ваш бизнес, чтобы лучше организовать его
Примечание 2: Вместо проверки кода ответа попробуйте использовать метод assertRedirect.