rspec 3 - odgnij metodę klasową

97

Uaktualniam z rspec 2.99 do rspec 3.0.3 i przekonwertowałem metody instancji do użycia allow_any_instance_of, ale nie wiem, jak odgiąć metodę klasy. Mam taki kod:

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

a mój test rspec 2 robi to:

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

Jak to robi Rspec 3?

Peter Sankauskas
źródło

Odpowiedzi:

173

Powinieneś zrobić

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

Sprawdź skróty metody doco .

Arup Rakshit
źródło
Próbuję to zaimplementować, ale kiedy piszę tę makietę, a następnie piszę expect(Class.foo).to eq(bar), otrzymuję „błąd z niewłaściwą liczbą argumentów”, ponieważ foometoda zwykle wymaga 2 argumentów ... ale chcę tylko, aby zwróciła to, co umieściłem w kodzie
sixty4bit
FWIW, ten formularz spowodowałby awarię mojego interpretera ruby. Jednak and_return nie jest ściśle potrzebne i można je pominąć. (Mój interpreter ruby ​​również się nie zawiesza.)
Ray Fix
2
@ sixty4bit Czy jest jakiś powód, dla którego nie możesz tego nazwać argumentami?
David Moles
4
@ sixty4bitexpect(Class.foo).to receive(bar).with(arg1, arg2).and_return({..object})
zhisme