rspec 3 - stub une méthode de classe

94

Je passe de rspec 2.99 à rspec 3.0.3 et j'ai converti les méthodes d'instance à utiliser allow_any_instance_of, mais je n'ai pas compris comment stuber une méthode de classe. J'ai un code comme celui-ci:

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

et mon test rspec 2 fait ceci:

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

Quelle est la manière Rspec 3 de faire cela?

Peter Sankauskas
la source

Réponses:

172

Tu devrais faire

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

Consultez les stubs de méthode doco .

Arup Rakshit
la source
J'essaie d'implémenter cela, mais lorsque j'écris cette simulation, puis j'écris, expect(Class.foo).to eq(bar)j'obtiens une "erreur de nombre d'arguments erroné" parce que la foométhode veut normalement 2 arguments .... mais je veux juste qu'elle renvoie ce que j'ai mis dans le stub
sixty4bit
FWIW, ce formulaire planterait mon interpréteur ruby. Cependant, and_return n'est pas strictement nécessaire et peut être laissé de côté. (Mon interprète ruby ​​ne plante pas non plus.)
Ray Fix
2
@ sixty4bit Y a-t-il une raison pour laquelle vous ne pouvez pas l'appeler avec des arguments?
David Moles
4
@ sixty4bitexpect(Class.foo).to receive(bar).with(arg1, arg2).and_return({..object})
zhisme