Страница 1 из 1

Тестирование формы с капчей

Добавлено: 2020.03.05, 00:16
andrew.pol
Как правильно написать тест к форме с капчей?

Есть простая форма:

Код: Выделить всё

<?php

namespace frontend\forms;

use yii\base\Model;

class ContactForm extends Model
{
    public $name;
    public $email;
    public $body;
    public $verifyCode;

    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            ['name', 'required'],
            ['body', 'required'],
            ['email', 'required'],
            ['email', 'email'],
            ['verifyCode', 'captcha'],
        ];
    }

    /**
     * @return array
     */
    public function attributeLabels()
    {
        return [
            'verifyCode' => 'Verification Code',
        ];
    }
}
Есть юнит тест к этой форме:

Код: Выделить всё

<?php

namespace frontend\tests\unit\forms;

use frontend\forms\ContactForm;

class ContactFormTest extends \Codeception\Test\Unit
{
    public function testCorrectForm()
    {
        $form = new ContactForm();
        $form->name = 'Tester';
        $form->email = 'tester@example.com';
        $form->body = 'body of current message';
        expect_that($form->validate());
    }
}
При запуске ругается на:
Failed asserting that a boolean is not empty.
Форма не проходит валидацию. Если в правилах капчи указать 'skipOnEmpty' => true, то тест проходит успешно. Но как-то мне этот способ не очень нравится.

Re: Тестирование формы с капчей

Добавлено: 2020.03.05, 07:32
maleks
В самом тесте можно на лету у формы подменять такие вещи через $validators = $model->getValidators(); , в т.ч. убрать вообще этот валидатор

Re: Тестирование формы с капчей

Добавлено: 2020.03.11, 05:25
andrew.pol
Решил вопрос проще.

Переписал тест вот так

Код: Выделить всё

<?php

namespace frontend\tests\unit\forms;

use frontend\forms\ContactForm;

class ContactFormTest extends \Codeception\Test\Unit
{
    public function testCorrect()
    {
        $form = new ContactForm();
        $form->name = 'Tester';
        $form->email = 'tester@example.com';
        $form->body = 'body of current message';
        expect_that($form->validate(['name', 'email', 'body']));
    }
}