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?

Peter Sankauskas
fuente

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 .

Arup Rakshit
fuente
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