我想测试我用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"> </dt><dd id="submit-element">
<input type="submit" name="submit" id="submit" value="Nu Versturen" /></dd></dl></form>
答案 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);
}