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!