Php 电子邮件验证。从网站访问时工作,但未通过单元测试

Php 电子邮件验证。从网站访问时工作,但未通过单元测试,php,unit-testing,yii2,Php,Unit Testing,Yii2,我今天遇到了一个相当奇怪的问题 我用这些规则建立了一个模型: public function rules() { return [ [['name', 'email', 'website'], 'required'], [['name'], 'string', 'max' => 512], [['name'], 'unique'], [['email'], 'email'], [['website'],

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

我用这些规则建立了一个模型:

public function rules()
{
    return [
        [['name', 'email', 'website'], 'required'],
        [['name'], 'string', 'max' => 512],
        [['name'], 'unique'],
        [['email'], 'email'],
        [['website'], 'url'],
    ];
}
当通过控制器访问时,这将相应地工作。但是我的单位 验证电子邮件时测试失败:

    $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);
我在表单中使用了相同的电子邮件,其中数据被允许进入数据库。但在这里使用时,is在第二次电子邮件验证时失败


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

如果您将错误与邮件一起转储,您会发现失败的不是电子邮件验证

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

如果查看(其中,
validate()
-调用最终结束):

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

将其更改为
$this->assertFalse($model->validate(['email']),'email无效')并且它应该可以工作


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

那么外观模型是如何验证方法的呢?@venca那是Yii的method@Wijnand它是否返回false或抛出错误?尝试转储模型变量并发布代码。
public function validateAttributes($model, $attributes = null)
{
    if (is_array($attributes)) {
        $attributes = array_intersect($this->attributes, $attributes);
    } else {
        $attributes = $this->attributes;
    }
    ...
}