单元测试自定义Zend_Form元素

时间:2011-05-11 23:39:34

标签: unit-testing zend-framework

这是一个冗长的问题,但我花了几个小时搜索和尝试不同的事情,但还没有解决它,所以这是我最后的希望。

我已经创建了一个自定义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试过的其他价值观是:

$phone = array('480', '123', '5678');
$phone = array( 480, 123, 5678 );
$phone = '480-123-5678';
$phone = '4801235678';

想不出还有什么可以尝试?

更新:添加控制器操作

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

正如你所看到的,没有太多事情发生。代码工作正常,只是尝试对其进行单元测试,以便我可以“证明”它的工作原理。

1 个答案:

答案 0 :(得分:0)

您需要的是这些内容:

$phone = array(
    'areanum' => 480,
    'geonum' => 123,
    'localnum' => 5678
);

虽然您最后创建了一个组合值,但该帖子仍会将其拆分为多个部分。