【问题标题】:Mocking away captcha field when testing zend Form测试zend Form时模拟验证码字段
【发布时间】:2011-06-16 17:38:28
【问题描述】:

我想测试我用 Zend_Form 创建的表单。现在的问题是我的表单中有一个验证码字段。 Zend 框架大师之一告诉我,我应该将验证码字段的验证模拟为模拟对象。

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

有人有这方面的经验吗?谁能帮帮我?

谢谢


更多信息:

我希望我的测试不会中断,因为它无法测试验证码字段。所以我需要找出某种方式,帖子不会因为验证码字段而停止。

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>

【问题讨论】:

  • 请链接到:phpunit.de/manual/current/en/index.html 3.0 已经过时了 :) (我假设您使用 3.5 ?) --- 我对 Zend Framework 并不执着,所以要提供一个有意义的答案我'd需要看到一些代码。但我相信其他人无论如何都能回答这个问题:)
  • 您可以在生成表单的代码中添加一个异常,以根据您的应用程序环境生成验证码(这不是 100% 代码覆盖率的最佳方式,但我可以让您暂时运行)
  • @Jeff。这就是我使用验证码处理测试表单的方式。原因是通常处理和验证验证码是 ZF 的工作,这意味着您作为开发人员,不要为其创建任何自定义逻辑或代码。
  • 基于 public 文件夹中 index.php 文件中 zend 的默认设置,定义了常量 'APPLICATION_ENV',如果没有通过 getenv 接收到值(您可以通过 . htaccess 并在 apache 中启用了 env_module)该值自动设置为生产。在您的表单生成代码中,您可以检查该常量,例如 if(APPLICATION_ENV == 'production'){ // 创建验证码元素 }
  • 它是开箱即用的,我使用了很多,即:如果我在开发环境中,当我的应用程序发送电子邮件时,我将它们发送给我自己的邮箱,我用它来显示更多信息,比如每个查询都运行相关的统计信息。

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


【解决方案1】:

我就开枪了,如果这是你想要的,请告诉我:

发件人:http://framework.zend.com/manual/en/zend.form.standardElements.html

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

你不能对它进行单元测试,因为你不能进行依赖注入(就像你确定的 zend 框架的许多部分一样),所以你需要一些方法将它注入到你的表单构建器中。

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) IndexControllerTest::testCanSubmitContactForm 传递给 PHPUnit_Framework_TestCase::getMock() 的参数 3 必须是一个数组,给定字符串,在 K:\stage5\tests\application 中调用\controllers\IndexControllerTest .php 在第 92 行并定义
  • 编辑了答案以说明这一点
【解决方案2】:

您只需要将验证码元素与表单分开,例如创建:

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

protected $_enableCaptcha = true;

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

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

}

然后在您的测试中禁用验证码。

也许 Zend Form 或 Captcha Element 已经有一些方法可以做到这一点。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多