2015-06-11 1 views
3

Сегодня я столкнулся с довольно странной проблемой.Проверка подлинности электронной почты. Работа при доступе с веб-сайта, но сбой в модульном тесте

Я создал модель с этими правилами:

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

Это работает, соответственно, при обращении через контроллер. Однако мой блок тест failes по проверке электронной почты:

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

Я использовал ту же электронную почту в том виде, в котором данные, поступивших в базу данных, как это должно быть. Но при использовании здесь происходит сбой при повторной проверке электронной почты.

Я пробовал другие форматы электронной почты, но это также не решит проблему. Есть идеи?

+0

и как выглядит * модель проверять * метод? – venca

+0

@venca, который является методом Yii – iamawebgeek

+0

@Wijnand возвращает значение false или оно вызывает ошибку? – iamawebgeek

ответ

4

Если вы сбросите ошибки с помощью getErrors(), вы увидите, что это не проверка электронной почты, которая терпит неудачу.

Причина это не работает, потому что вы не указать атрибуты подтверждению в виде массива:

Если вы смотрите в Validator-code (где validate() -Call в конечном счете заканчивается):

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.'); и он должен работать

Edit: Кстати, это очень легко сделать ошибку, так как структура делает преобразовать одну строку в массив во многих других местах. Таким образом, это поведение несовместимо.

+0

[создана проблема] (https://github.com/yiisoft/yii2/issues/8752). – Blizz

Смежные вопросы