在测试zend Form时嘲笑验证码字段

时间:2011-01-27 17:48:00

标签: php zend-framework mocking phpunit zend-form

我想测试我用Zend_Form创建的表单。现在的问题是我的表单中有一个验证码字段。 Zend Framework Guru的一个人告诉我,我应该模拟验证验证码字段的模拟对象。

我在PHPUnit手册上读过这个http://www.phpunit.de/manual/3.0/en/mock-objects.html。但我真的不明白我怎么能嘲笑验证器。

有没有人有这方面的经验?任何人都可以帮助我吗?

由于


更多信息:

我希望我的测试不要破坏,因为它无法测试验证码字段。所以我需要找出一些方法,因为captcha字段不会停止帖子。

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生成表单的样子:

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


<input type="hidden" name="captcha[id]" value="a4957b2dbfea79d8bd654428f6eb0a2c" id="captcha-id" />

<input type="text" name="captcha[input]" id="captcha-input" value="" />

<p class="description">Voer de 6 letters in die hierboven getoond worden. Deze vraag wordt gebruikt om te testen of u een menselijke bezoeker bent teneinde spam-inzendingen te vermijden.</p></dd>

<dt id="submit-label">&#160;</dt><dd id="submit-element">

<input type="submit" name="submit" id="submit" value="Nu Versturen" /></dd></dl></form>

3 个答案:

答案 0 :(得分:3)

我会开火,让我知道这是否是你想要的:

来自:http://framework.zend.com/manual/en/zend.form.standardElements.html

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

你不能单独测试这个,因为你不能进行依赖注入(就像你确定已经想到的那样,你可以使用某种方法将它注入到表单构建器中)。

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 ;)

并添加它而不是默认的验证码元素。

不确定问题的哪个部分你遇到了麻烦,所以我对所有内容进行了一些研究

答案 1 :(得分:0)

您只需要将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已经有了一些方法。

您也可以创建没有验证码的基本表单并对其进行测试,然后对表单进行子类化并添加验证码元素。

答案 2 :(得分:-1)

对于测试,您可以在表单中使用此条件:

if (!\Zend_Session::$_unitTestEnabled) {
     $this->addElement($captcha);
}