Problemas con Carbon::now() y los test unitarios

[Cuando trabajas con Carbon] las fechas y los test pueden ser un auténtico engorro. El problema suele ser cuando tienes una situación como ésta:

$objeto = Clase();

$this->assertEquals(Carbon::now(), $objeto->fechaCreacion());

Y dentro del objeto tienes algo como:

public function __constructor()
{
    $this->fechaCreacion = Carbon::now();
}

public function fechaCreacion()
{
    return $this->fechaCreacion;
}

¿Dónde esta el problema?

El problema está en que cuando llamas a Carbon::now() dentro del constructor es un momento diferente de cuando lo llamas en la aserción.

Seguro que se te ocurren «napas» como comparar solo el día, la hora y los minutos pero no los segundos o milisegundos.

O hacer alguna trampa en Clase para que pase los test. Nunca, nunca, jamás está justificado trampear nuestro código para que pase un test. Bueno, «nunca, nunca» igual es demasiado rotundo, pero no se me ocurre ahora mismo una situación donde esté justificado.

¿Y cuál es la solución?

Una posible (y buena) solución es usar el método setTestNow() de Carbon:

$now = Carbon::now();
Carbon::setTestNow($now);

Y luego en la aserción:

$this->assertEquals($now, $objeto->fechaCreacion());

¡Y problema resuelto!


¿Sabes lo que es el reto de PHP?

He creado el PHP Journey, una plataforma para que recibas de forma gratuita un email cada día con una pequeña perla de sabiduría de PHP y una pregunta que deberás responder.

Cada día pones a prueba tus conocimientos y aprendes algo nuevo.

Apúntate aquí:

https://urlantools.urlanheat.com/newsletter/php-journey/subscribe


Deja un comentario