Макетирование поля капчи при тестировании Zend Form - PullRequest
2 голосов
/ 27 января 2011

Я хочу проверить мою форму, которую я создал с помощью Zend_Form. Теперь проблема в том, что у меня есть поле с капчей в моей форме. И один из гуру Zend Framework сказал мне, что я должен смоделировать проверку поля капчи над фиктивным объектом.

Я прочитал это http://www.phpunit.de/manual/3.0/en/mock-objects.html в руководстве по PHPUnit. Но я действительно не понимаю, как я могу издеваться над валидатором.

У кого-нибудь есть опыт с этим? Кто-нибудь может мне помочь?

Спасибо


Дополнительная информация:

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

public function testCanSubmitContactForm(){
   $mock = $this->getMock('Zend_Form_Element_Captcha', array(), '', false);
   $mock->expects($this->once()->method("isValid")->will($this->resturnValue(true)));

   $this->request->setMethod('post')
                 ->setPost(array(
                     'email'    => 'someemail@adres.com',
                     'comment'  => 'Testing the bladiebla contact form'
                     'captcha'  =>  ''//no idea  
                 ));
   $this->dispach('/contact');


}

Вот как выглядит моя сгенерированная Zend_Form форма:

<code>    <form id="contact-form" enctype="application/x-www-form-urlencoded" method="post" action="/index/contact"><dl class="zend_form">

<dt id="email-label"><label for="email" class="required">Uw E-mailadres</label></dt>

<dd id="email-element">
<input type="text" name="email" id="email" value="" /></dd>

<dt id="comment-label"><label for="comment" class="required">Stel hieronder uw vraag of geef je commentaar op</label></dt>

<dd id="comment-element">

<textarea name="comment" id="comment" cols="71" rows="24"></textarea></dd>

<dt id="captcha-input-label"><label for="captcha-input" class="required">SPAM Beveiliging</label></dt>

<dd id="captcha-element">

<pre> _    _    __   __    ______    ______    ______     ___    
| \  / ||  \ \\/ //  /_   _//  /_   _//  /_____//   / _ \\  
|  \/  ||   \ ` //   `-| |,-    -| ||-   `____ `   | / \ || 
| .  . ||    | ||      | ||     _| ||_   /___//    | \_/ || 
|_|\/|_||    |_||      |_||    /_____//  `__ `      \___//  
`-`  `-`     `-`'      `-`'    `-----`   /_//       `---`   
                                         `-`                

Voer de 6 букв в виде иероглифа. Deze vraag wordt gebruikt om te testen of ueen menselijke bezoeker bent teneinde spam-inzendingen te vermijden.

Ответы [ 3 ]

3 голосов
/ 27 января 2011

Я просто уйду, дайте мне знать, если это то, что вы хотите:

От: http://framework.zend.com/manual/en/zend.form.standardElements.html

// Concrete instance:
$element->setCaptcha(new Zend_Captcha_Figlet());

Вы не можете выполнить юнит-тестирование, так как можетене делайте инъекцию зависимостей (как и во многих частях Zend Framework, как вы, наверняка, поняли), поэтому вам нужен какой-то способ внедрить это в конструктор форм.

public function setCaptcha(Zend_Captcha $cap) { // override the default cap } 

или если ваше приложение допускает его передачуэто в конструкторе (было бы лучше в любом случае, но это может быть сложно с zf)

Тогда у вас есть стандартный макет:

$mock = $this->getMock("Zend_Form_Element_Captcha", array(), array(), '', false /*don't call original constructor'*/);
$mock->expects($this->once())->method("isValid")->will($this->returnValue(true)); // Not sure about the method name ;)

И добавьте его вместо элемента капчи по умолчанию.

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

0 голосов
/ 03 января 2014

Для тестирования вы можете использовать это условие в вашей форме:

if (!\Zend_Session::$_unitTestEnabled) {
     $this->addElement($captcha);
}
0 голосов
/ 27 января 2011

Вам просто нужно отделить элемент captcha от формы, например, создать:

public function addCaptcha()
{
   $this->addElement()...
}

protected $_enableCaptcha = true;

public function disableCaptcha()
{
   $this->_enableCaptcha = false;
}

public function init()
{
   //    ...
   if ($this->_enableCaptcha) {
      $this->addCaptcha();
   }

}

Затем в своем тесте просто отключите CAPTCHA.

Возможно, Zend Form или Captcha Element уже имееткакой-то метод для этого.

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

...