rspec 3 - stub un metodo di classe


94

Sto aggiornando da rspec 2.99 a rspec 3.0.3 e ho convertito i metodi di istanza da utilizzare allow_any_instance_of, ma non ho capito come stub un metodo di classe. Ho un codice come questo:

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

e il mio test rspec 2 fa questo:

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

Qual è il modo Rspec 3 per farlo?

Risposte:


172

Dovresti fare

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

Dai un'occhiata agli stub del metodo doco .


Sto cercando di implementarlo ma quando scrivo quel mock e poi scrivo expect(Class.foo).to eq(bar)ottengo un "errore di numero errato di argomenti" perché il foometodo normalmente vuole 2 argomenti ... ma voglio solo che restituisca ciò che ho inserito nello stub
sixty4bit

FWIW, questo modulo manderebbe in crash il mio interprete Ruby. Tuttavia, and_return non è strettamente necessario e può essere omesso. (Anche il mio interprete Ruby non si blocca.)
Ray Fix

2
@ sixty4bit C'è un motivo per cui non puoi chiamarlo con argomenti?
David Moles

4
@ sixty4bitexpect(Class.foo).to receive(bar).with(arg1, arg2).and_return({..object})
zhisme
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.