Я пытаюсь проверить свой контроллер входа в систему, я прочитал много сообщений и попробовал то, что показано в ссылке 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"> </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'.думая, что диспетчер или маршрутизатор могут вести себя немного иначе в тестовой среде.(перенаправления, ответ, запрос и т. д.).
Спасибо