ruby-on-rails rspec stub

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 }