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

标签 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);

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

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

最佳答案

如果您使用 getErrors() 转储错误您会看到失败的不是电子邮件验证。

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

如果您查看 Validator-code (validate() 调用最终结束的地方):

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.'); 它应该可以工作

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

关于php - 电子邮件验证。从网站访问时工作,但未通过单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30778690/

相关文章:

javascript - 通过减去选项计算总数 - 动态形式 - Yii2

yii2 - 如何在前端和后端使用模型或模块

php - 使用curl和正则表达式获取表数据

php - 将数据添加到注册表中

php - .htaccess 在 SSL/端口 443 下被忽略

c# - 为持久数据创建和删除编写单元测试

PHP:使用 php 裁剪时出现黑色图像

c# - nunit 和 web.config appSettings

c# - 使用模拟(Moq)对象更改 Autofac 模块中的注入(inject)

php - 如何在 Yii2 中使用 swiftMailer