单元测试自定义Zend_Form元素
问题描述:
这是一个冗长的问题,但我花了几个小时寻找和尝试不同的事情,但还没有得到它解决,所以这是我的最后希望。单元测试自定义Zend_Form元素
我创建了一个自定义的Zend_Form_Element,我从这里得到了代码:http://www.zendcasts.com/ajaxify-your-zend_form-validation-with-jquery/2010/04/所有的代码都可以在该网站上找到,但基本上我创建了一个具有多个输入元素的窗体,它返回一个值。
做对得到的网页上查看源文件,表单元素看起来是这样
<input size="3" maxlength="3" id="phone-areanum" name="phone[areanum]" value="" type="text">
<input size="3" maxlength="3" id="phone-geonum" name="phone[geonum]" value="" type="text">
<input size="4" maxlength="4" id="phone-localnum" name="phone[localnum]" value="" type="text">
这里是单元测试,我觉得应该工作,但不是
public function testValidDataRedirectsToAppointmentTimePage()
{
$phone = array('areanum'=>'480', 'geonum'=>'123', 'localnum'=>'5678');
$this->request->setMethod('post')
->setPost(array(
'phone' => $phone,
'name' => 'Smith'
));
$this->dispatch('/sign-in');
// assert that user was redirected to current-patient page
$this->assertRedirectTo('/current-patient');
}
我如果用户输入他们的电话号码和姓名到字段中,他们将被重定向到正确的页面。当我将Zend_Debug::dump($this->getResponse()->getBody());
卡入单元测试函数时,我能够确定我在post中设置的值导致错误,并且页面未正确加载。 我已经试过了$手机其他值:
$phone = array('480', '123', '5678');
$phone = array(480, 123, 5678);
$phone = '480-123-5678';
$phone = '48';
想不出还有什么没有尝试?
更新:添加控制器动作
public function phoneAction()
{
$this->view->title = "Please Sign In";
$this->view->headTitle("Sign In");
$form = new Application_Form_Phone();
$this->view->form = $form;
if($this->getRequest()->isPost()) {
if($form->isValid($this->getRequest()->getPost())) {
$phone = $form->getValue('phone');
$name = $form->getValue('name');
// function to get user's id from their info
$this->_session->user_id = $this->_getUserId($phone, $name);
return $this->_redirect('/current-patient');
}
}
}
class Application_Form_Phone extends Zend_Dojo_Form
{
public function init()
{
$this->addElementPrefixPath('Grabby_Form_Validate', 'Grabby/Form/Validate', 'validate');
$this->setName('phoneform');
$this->setMethod('post');
$phone = new Grabby_Form_Element_Phone('phone');
$phone->addValidator(new Grabby_Form_Validate_Phone());
$this->addElement($phone);
$this->addElement('ValidationTextBox', 'name', array(
'required' => true,
'label' => 'Last Name',
'trim' => true,
'promptMessage' =>'Enter your last name',
'InvalidMessage' => 'Last name required',
));
$this->addElement('SubmitButton', 'submitbutton', array(
'label' => 'Submit',
'ignore' => true,
));
}
}
正如你可以看到有没有多的事情。代码工作正常,只是试图单元测试,所以我可以“证明”它的工作原理。
答
你需要的可能是沿着这些路线的东西:
$phone = array(
'areanum' => 480,
'geonum' => 123,
'localnum' => 5678
);
虽然创建最终的组合值,后仍发送它分成几部分。
请问您可以发布控制器/表单代码吗?谢谢 – opHASnoNAME 2011-05-12 05:01:05
从技术上讲,这可能不是单元测试_element_,而是一起测试元素,窗体和控制器。也许更狭窄的单元测试关注元素本身?有关示例,请参见[form element unit-tests](http://framework.zend.com/code/listing.php?repname=Zend+Framework&path=%2Ftrunk%2Ftests%2FZend%2FForm%2FElement%2Fa99e5f5c78a10fd004ba3f5b1f5c641c9)。 – 2011-05-12 09:30:39
@DavidWeinraub你是对的。我试图一起测试元素,窗体和控制器。我对单元测试很陌生,所以对我最有“意义”。感谢您的链接,看到其他单元测试一定会对我有所帮助。 – 2011-05-12 23:20:47