Модульное тестирование пользовательского элемента Zend_Form

#unit-testing #zend-framework

#модульное тестирование #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. не могли бы вы, пожалуйста, опубликовать код контроллера / формы? Спасибо

2. Технически, это, вероятно, не модульное тестирование элемента , а тестирование элемента, формы и контроллера вместе взятых. Возможно, более узкий модульный тест, сфокусированный на самом элементе? Смотрите модульные тесты элемента формы для примеров. ……….

3. @DavidWeinraub Вы правы. Я пытаюсь протестировать элемент, форму и контроллер вместе. Я новичок в модульном тестировании, поэтому для меня это имело наибольший «смысл». Спасибо за ссылку, просмотр других модульных тестов определенно будет полезен для меня.

4. Хм, вы отправляете «$this-> dispatch(‘/ sign-in’); » не phoneAction?

5. @ArneRie Извините, я должен был упомянуть об этом раньше. В моем файле application.ini я задаю пользовательский маршрут для установки «/ sign-in» для действия phone.

Ответ №1:

Вероятно, вам нужно что-то в этом роде:

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

Хотя в конце вы создаете объединенное значение, post все равно отправляет его разделенным на части.