En mi ejemplo simplificado de lo que estoy haciendo realmente, digamos que tengo 2 llamadas a la base de datos:métodos de prueba envueltas en bloques con RSpec
Repo.add(something_stringy)
Repo.remove(something_floaty)
y quiero utilizar burla para las llamadas bases de datos, como las llamadas reales se pondrá a prueba en otro lugar:
let(:repo){
repo = double("Repo")
repo.should_receive(:add).with(instance_of(String))
repo.should_receive(:remove).with(instance_of(Float))
repo
}
before { FakeKlass.const_set :Repo, repo }
eso es todo lo fino y elegante, pero ahora si me envuelvo las llamadas en una transacción que estoy un poco perplejo:
Repo.transaction do
# ... some error checking in here somewhere...
Repo.add(something_stringy)
Repo.remove(something_floaty)
end
porque si escribo una maqueta que recibe transaction
que va a recibir la llamada, pero todo en el bloque no se llamará, y me sale:
esperados: 1 vez recibidas: 0 veces
para todos los demás simulacros. ¿Alguien podría mostrarme cómo debería escribir mis especificaciones para lidiar con esto? Intenté leer la página relevante en el libro de RSpec en around(:each)
, pero para mí era tan claro como el barro.
Cualquier ayuda es muy apreciada.
gracias, realmente útil. – iain
gracias, esto también me ayudó a probar el código envuelto Redis.pipelined que estaba actuando de forma similar a la transacción. –