rspec 3 - stub un método de clase


94

Estoy actualizando de rspec 2.99 a rspec 3.0.3 y he convertido métodos de instancia para usar allow_any_instance_of, pero no he descubierto cómo stub un método de clase. Tengo un código como este:

module MyMod
  class Utils
    def self.find_x(myarg)
      # Stuff
    end
  end
end

y mi prueba rspec 2 hace esto:

MyMod::Utils.stub(:find_x).and_return({something: 'testing'})

¿Cuál es la forma de Rspec 3 de hacer esto?

Respuestas:


172

Deberías hacer

allow(MyMod::Utils).to receive(:find_x).and_return({something: 'testing'})

Consulte los códigos auxiliares del método doco .


Estoy tratando de implementar esto, pero cuando escribo ese simulacro y luego escribo expect(Class.foo).to eq(bar), obtengo un "error de número incorrecto de argumentos" porque el foométodo normalmente quiere 2 argumentos ... pero solo quiero que devuelva lo que puse en el código auxiliar
sixty4bit

FWIW, este formulario colapsaría mi intérprete ruby. Sin embargo, and_return no es estrictamente necesario y puede omitirse. (Mi intérprete de ruby ​​tampoco falla.)
Ray Fix

2
@ sixty4bit ¿Hay alguna razón por la que no pueda llamarlo con argumentos?
David Moles

4
@ sixty4bitexpect(Class.foo).to receive(bar).with(arg1, arg2).and_return({..object})
zhisme
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.