Я пытаюсь провести модульное тестирование в личном проекте PHP, как хороший маленький программист, и я хотел бы сделать это правильно. Из того, что я слышал, вы должны протестировать только открытый интерфейс метода, но мне было интересно, будет ли это применяться ниже.
У меня есть метод, который генерирует маркер сброса пароля в случае, если пользователь забыл свой пароль. Метод возвращает одну из двух вещей: ничего (ноль), если все работало нормально, или код ошибки, указывающий, что пользователь с указанным именем пользователя не существует.
Если я только тестирую общедоступный интерфейс, как я могу быть уверен, что токен сброса пароля будет в базе данных, если имя пользователя допустимо, и не будет в базе данных, если имя пользователя НЕ допустимо? Должен ли я делать запросы в моих тестах, чтобы проверить это? Или я просто должен предположить, что моя логика верна?
Теперь этот метод очень прост, и это не так уж важно - проблема в том, что эта же ситуация применима ко многим другим методам. Что вы делаете в модульных тестах, ориентированных на базу данных?
Код, для справки, если необходимо:
public function generatePasswordReset($username)
{
$this->sql='SELECT id
FROM users
WHERE username = :username';
$this->addParam(':username', $username);
$user=$this->query()->fetch();
if (!$user)
return self::$E_USER_DOESNT_EXIST;
else
{
$code=md5(uniqid());
$this->addParams(array(':uid' => $user['id'],
':code' => $code,
':duration' => 24 //in hours, how long reset is valid
));
//generate new code, delete old one if present
$this->sql ='DELETE FROM password_resets WHERE user_id=:uid;';
$this->sql.="INSERT INTO password_resets (user_id, code, expires)
VALUES (:uid, :code, now() + interval ':duration hours')";
$this->execute();
}
}