Yii单元测试和验证码

时间:2015-05-12 20:25:25

标签: php unit-testing selenium yii captcha

有人知道如何避免使用Yii 1.x进行单元测试(Selenium)中的验证码吗? 我试图在我的测试中使用curapnt验证码值:

$vc_key = "Yii.CCaptchaAction." . Yii::app()->getId() . ".site.captcha";
$captchaCode = Yii::app()->session->get($vc_key);

- 得到空值。也尝试过:

$captcha=Yii::app()->getController()->createAction("captcha");
$captchaCode = $captcha->verifyCode;

收到错误:致命错误:在非对象上调用成员函数createAction()

1 个答案:

答案 0 :(得分:0)

用这种方式工作: 1.添加到您的测试配置(它由Yii单元测试使用)一些变量可以说,它将是" testmode":

...
'params' => array(
    'testmode' => true, // to avoid captcha validation
),
...
  1. 在您的模型验证规则中设置相应的条件。对我而言,它遵循: 在规则中:

    阵列(     '附加码&#39 ;,     ' captchaValid&#39 ;,     ' allowEmpty' =>!Yii :: app() - > user-> isGuest || !CCaptcha :: checkRequirements()     ' enableClientValidation' =>真正,     ' message' => Yii :: t(' app','错误的代码'),     '上' =>阵列('创建&#39), ),

  2. 下面:

    public function captchaValid($field, $params) {
        if(!$this->hasErrors($field))
        {
            if (Yii::app()->params['testmode'] == true) // here is our mark
                return;
            $vc_key = "Yii.CCaptchaAction." . Yii::app()->getId() . ".site.captcha";
            if ( Yii::app()->session->get($vc_key) != $this->{$field} )
            {
                $this->addError($field, $params['message']);
            }
    
        }
    }
    

    这就是全部。对于我的情况,它是一些额外的完成,但在大多数情况下,上面的方法应该工作。如果您遇到一些问题,请告诉我。