ruby on rails - RSpec: cadenas de trozos con argumentos?
ruby-on-rails stub (3)
Solo me pregunto si / cómo se pueden pasar los argumentos en las cadenas de código auxiliar rspec. Para dar un ejemplo, supongamos que tengo la siguiente acción:
def index
@payments = Payment.order(:updated_at).where(:paid => true)
@bad_payments = Payment.order(:some_other_field).where(:paid => false)
end
En la especificación de mi controlador, me gustaría poder apagar ambos métodos y obtener resultados diferentes. Si solo el campo @payments
estuviera en la acción, usaría algo como
Payment.stub_chain(:order, :where) { return_this }
Pero, por supuesto, eso devolverá el mismo valor para @bad_payments
.
Entonces, en resumen, ¿cómo :updated_at
y :paid => true
como condiciones de stub?
Con rspec > 3
usa esta sintaxis:
expect(Converter).to receive_message_chain("new.update_value").with(''test'').with(no_args)
en lugar de stub_chain
Lea más sobre las cadenas de mensajes en la documentación . Y here está la documentación de los emparejadores de argumentos.
Puedes usar el bloque de código auxiliar anidado. El bloque puede aceptar argumentos y el valor de retorno se utiliza como valor de retorno de la función.
Uso tap
porque el stub
no devuelve la llamada. El simulacro creado por el double
se devuelve como resultado del order
del método, que es where
método es talón nuevamente.
Payment.stub(:order) { |order|
double(''ordered_payments'').tap { |proxy|
proxy.stub(:where) { |where|
[order, where]
}
}
}
Payment.order(:updated_at).where(:paid => true)
# => returns [:updated_at, {:paid => true}]
Puedes usar esto:
Payment.stub_chain(:order, :where).with(:updated_at).with(:paid => true) { return_this }