rspec 3 - stub eine Klassenmethode

94

Ich aktualisiere von rspec 2.99 auf rspec 3.0.3 und habe Instanzmethoden für die Verwendung konvertiert allow_any_instance_of, aber nicht herausgefunden, wie eine Klassenmethode gestoppt werden kann. Ich habe folgenden Code:

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

und mein rspec 2 Test macht das:

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

Wie geht das mit Rspec 3?

Peter Sankauskas
quelle

Antworten:

171

Du solltest tun

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

Schauen Sie sich die doco Method Stubs an .

Arup Rakshit
quelle
Ich versuche dies zu implementieren, aber wenn ich diesen Mock schreibe und dann schreibe, expect(Class.foo).to eq(bar)erhalte ich einen "Fehler mit der falschen Anzahl von Argumenten", weil die fooMethode normalerweise 2 Argumente will ... aber ich möchte nur, dass sie zurückgibt, was ich in den Stub gesetzt habe
Sixty4bit
FWIW, dieses Formular würde meinen Ruby-Interpreter zum Absturz bringen. And_return wird jedoch nicht unbedingt benötigt und kann weggelassen werden. (Mein Ruby-Interpreter stürzt auch nicht ab.)
Ray Fix
2
@ sixty4bit Gibt es einen Grund, warum du es nicht mit Argumenten aufrufen kannst?
David Moles
4
@ sixty4bitexpect(Class.foo).to receive(bar).with(arg1, arg2).and_return({..object})
zhisme