Estoy tratando de probar la unidad en un proyecto personal de PHP como un buen pequeño programador, y me gustaría hacerlo correctamente. Por lo que escuché, lo que se supone que debes probar es solo la interfaz pública de un método, pero me preguntaba si eso se aplicaría a continuación.¿Qué tan lejos debería llegar con las pruebas unitarias?
Tengo un método que genera un token de restablecimiento de contraseña en caso de que el usuario olvide su contraseña. El método devuelve una de dos cosas: nada (nulo) si todo funcionó bien, o un código de error que indica que el usuario con el nombre de usuario especificado no existe.
Si solo estoy probando la interfaz pública, ¿cómo puedo estar seguro de que el token de restablecimiento de contraseña va a la base de datos si el nombre de usuario es válido y NO va a la base de datos si el nombre de usuario NO es válido? ¿Debo realizar consultas en mis pruebas para validar esto? ¿O debería asumir que mi lógica es sólida?
Ahora, este método es muy simple y esto no es tan importante: el problema es que esta misma situación se aplica a muchos otros métodos. ¿Qué haces en las pruebas de unidad centrada en la base de datos?
Código, para referencia si es necesario:
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();
}
}
Lo mejor de las pruebas unitarias, al menos para mí, es que le muestra dónde necesita refactorizar. También ayuda a resaltar las dependencias. Sugeriría que su 'SELECT' y su' DELETE + INSERT' deberían refactorizarse en sus propios métodos, que la generación de contraseñas debería ser en su propia –
@pcampbell - su comentario debería ser una respuesta –