rspec 3 - rintisan metode kelas

95

Saya mengupgrade dari rspec 2.99 ke rspec 3.0.3 dan telah mengonversi metode instance untuk digunakan allow_any_instance_of, tetapi belum menemukan cara untuk menghentikan metode kelas. Saya punya kode seperti ini:

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

dan tes rspec 2 saya melakukan ini:

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

Apa cara Rspec 3 untuk melakukan ini?

Peter Sankauskas
sumber

Jawaban:

172

Kamu seharusnya melakukan

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

Lihat rintisan Metode doco .

Arup Rakshit
sumber
Saya mencoba menerapkan ini tetapi ketika saya menulis tiruan itu dan kemudian menulis expect(Class.foo).to eq(bar)saya mendapatkan "kesalahan jumlah argumen" karena foometode biasanya menginginkan 2 argumen .... tetapi saya hanya ingin mengembalikan apa yang saya masukkan ke dalam rintisan
sixty4bit
FWIW, formulir ini akan merusak penerjemah ruby ​​saya. Namun, and_return tidak sepenuhnya dibutuhkan dan dapat ditinggalkan. (Penerjemah ruby ​​saya juga tidak crash.)
Ray Fix
2
@ sixty4bit Adakah alasan Anda tidak dapat menyebutnya dengan argumen?
David Moles
4
@ sixty4bitexpect(Class.foo).to receive(bar).with(arg1, arg2).and_return({..object})
zhisme