电邮验证。从网站访问时工作,但单元测试失败

时间:2015-06-11 10:48:11

标签: php unit-testing yii2

我今天遇到了一个相当奇怪的问题。

我已经建立了一个包含这些规则的模型:

public function rules()
{
    return [
        [['name', 'email', 'website'], 'required'],
        [['name'], 'string', 'max' => 512],
        [['name'], 'unique'],
        [['email'], 'email'],
        [['website'], 'url'],
    ];
}

通过Controller访问时,这是相应的。不过我的单位 测试在验证电子邮件时失败:

    $model->email = 'somethinghan.nl';
    $this->assertFalse($model->validate('email'),
        'Email is invalid.');
    $model->email = 'student@han.nl';
    $this->assertTrue($model->validate('email'),
        'Validating email with a valid email: ' . $model->email);

我在表单中使用了相同的电子邮件,其中数据被允许进入数据库。但是在这里使用时,第二次电子邮件验证失败了。

我尝试过其他电子邮件格式,但这也无法解决问题。有什么想法吗?

1 个答案:

答案 0 :(得分:4)

如果您使用getErrors()转储错误,您会发现错误的电子邮件验证不是。

它不起作用的原因是因为你没有指定要作为数组验证的属性:

如果您查看Validator-codevalidate() - 电话最终结束的地方):

public function validateAttributes($model, $attributes = null)
{
    if (is_array($attributes)) {
        $attributes = array_intersect($this->attributes, $attributes);
    } else {
        $attributes = $this->attributes;
    }
    ...
}

所以基本上:如果它不是一个数组,它会被抛出,所以它会验证所有属性。

将其更改为$this->assertFalse($model->validate(['email']), 'Email is invalid.');,它应该可以正常工作

编辑:BTW,这是一个非常容易犯的错误,因为框架 将单个字符串转换为许多其他地方的数组。所以这种行为并不是真的一致。