El Patrón AAA
Arrange, Act, Assert: cómo estructurar un unit test para que se entienda qué está protegiendo.
Uno de los patrones más usados para estructurar un unit test es AAA: Arrange, Act, Assert.
Arrange → Act → Assert
Arrange prepara el estado necesario para ejecutar el test. Act ejecuta el comportamiento que queremos verificar —en general conviene que haya una única acción principal, para que el propósito del test sea evidente—. Assert verifica el resultado esperado.
describe('calculateCancellationFee', () => {
it('charges 50% of the deposit when cancelled with less than 24h notice', () => {
// Arrange
const deposit = Money.of(2000);
const hoursBeforeReservation = 3;
// Act
const fee = calculateCancellationFee(deposit, hoursBeforeReservation);
// Assert
expect(fee).toEqual(Money.of(1000));
});
});
El valor de AAA no está en escribir los comentarios de cada bloque. Su beneficio real es que hace evidente la intención del test —dado este estado, cuando ocurre este comportamiento, entonces esto debería ser cierto—, por lo que se relaciona naturalmente con el formato Given/When/Then que usamos desde el primer artículo de este tema.
Una sola acción por test. Si el bloque Act tiene tres llamadas, el test suele estar verificando tres comportamientos y su nombre no puede describirlos a todos. Cuando falla, el mensaje no dice cuál se rompió.
Un único concepto, no una única línea. No significa una única línea de expect: significa un único concepto verificado. Comprobar los cuatro campos de una Reservation recién creada es un concepto; comprobar además que se envió el mail es otro, y va en otro test.
Con el test ya estructurado, el próximo problema aparece apenas ReservationService empieza a depender de otros componentes: qué reemplazar, y con qué. De eso tratan los dobles de test.
