Truquitos: Usando múltiples change matchers con RSpec

Es posible usar múltiples change matchers de RSpec con un solo bloque de código. Lo único que necesitas es usar la palabra clave and para conectarlos.

La forma general es algo así:

    expect{
        accion_que_produce_cambio
    }.to change(...)
     .and change(...)
     ...
     .and change(...)

Veamos cómo esto puede ayudarnos usando un ejemplo.

Imagina que tienes usuarios con diferentes roles en tu aplicación, y hay un evento de pánico especial que envía diferentes números de notificaciones dependiendo del rol del usuario. Puedes probar los cambios en el conteo de notificaciones para cada usuario usando el mismo bloque:

    admin_user = FactoryBot.create(:user, role: :admin)
    moderator_user = FactoryBot.create(:user, role: :moderator)
    normal_user = FactoryBot.create(:user, role: :normal)

    expect {
        trigger_panic_event
    }.to change(admin_user.notifications, :count).by(3)
     .and change(moderator_user.notifications, :count).by(2)
     .and change(normal_user.notifications, :count).by(1)

Esto es muy útil cuando escribes pruebas para Rails porque a veces queremos verificar los efectos de una sola acción en diferentes entidades. Te ayuda a crear pruebas concisos y prevenir la duplicación de código.

Espero que esto te ayude a escribir mejores pruebas y software.

¡Gracias por leer!

Juan Luis Orozco Villalobos

¡Hola! Soy Juan, ingeniero de software y consultor en Budapest. Me especializo en computación en la nube e IA, y me encanta ayudar a otros a aprender sobre tecnología e ingeniería