ruby - mocks - RSpec Stubbing: Devuelve el parámetro
rspec subject (3)
Aunque mi pregunta es bastante directa, no pude encontrar una respuesta por aquí:
¿Cómo puedo marcar un método y devolver el parámetro en sí mismo (por ejemplo, en un método que realiza una operación de matriz)?
Algo como esto:
interface.stub!(:get_trace).with(<whatever_here>).and_return(<whatever_here>)
El método de código auxiliar ha sido desaprobado a favor de esperar.
expect(object).to receive(:get_trace).with(anything) do |value|
value
end
https://relishapp.com/rspec/rspec-mocks/v/3-2/docs/configuring-responses/block-implementation
Nota: el método de código auxiliar ha quedado en desuso. Por favor, vea esta respuesta para la forma moderna de hacer esto.
stub!
Puede aceptar un bloque. El bloque recibe los parámetros; el valor de retorno del bloque es el valor de retorno del código auxiliar:
class Interface
end
describe Interface do
it "should have a stub that returns its argument" do
interface = Interface.new
interface.stub!(:get_trace) do |arg|
arg
end
interface.get_trace(123).should eql 123
end
end
Puedes usar allow
(stub) en lugar de expect
(simulacro):
allow(object).to receive(:my_method_name) { |param1, param2| param1 }
Con parámetros nombrados:
allow(object).to receive(:my_method_name) { |params| params[:my_named_param] }
Aquí hay un ejemplo de la vida real:
Supongamos que tenemos un S3StorageService
que carga nuestros archivos a S3 usando el método upload_file
. Ese método devuelve la URL directa de S3 a nuestro archivo cargado.
def self.upload_file(file_type:, pathname:, metadata: {}) …
Queremos detener esa carga por muchas razones (pruebas fuera de línea, mejoras de rendimiento ...):
allow(S3StorageService).to receive(:upload_file) { |params| params[:pathname] }
Ese código auxiliar solo devuelve la ruta del archivo.