/ / Rspec में रैंड को कैसे स्टब करें? - रूबी, आरएसपीईसी

Rspec में रैंड कैसे रगड़ें? - रूबी, आरएसपीसी

मैं रूबी 2.3.4 और rspec 3.6.0 का उपयोग कर रहा हूं।

मैं एक वस्तु के लिए एक परीक्षण लिख रहा हूँ जो उपयोग करता है rand(10000..99999)। मैं किसी भी डॉक्स को नहीं ढूंढ सकता rand यह देखने के लिए कि यह किस वस्तु का हिस्सा है। मैंने हठ करने की कोशिश की Kernel, Object, तथा Random (नीचे देखें) लेकिन मेरी किसी भी कोशिश का नतीजा नहीं निकला rand वस्तु के लिए अचेत होना।

allow(Kernel).to receive(rand).and_return(12345)
allow(Object).to receive(rand).and_return(12345)
allow(Random).to receive(rand).and_return(12345)

किसी भी मदद की सराहना की है।

उत्तर:

जवाब के लिए 5 № 1

rand वास्तव में में लागू किया गया है Kernel मॉड्यूल। हालाँकि, अपने कोड के अंदर विधि को कॉल करते समय, विधि रिसीवर वास्तव में आपकी अपनी वस्तु है।

निम्न वर्ग मान लें:

class MyRandom
def random
rand(10000..99999)
end
end

my_random = MyRandom.new
my_random.random
# => 56789

कॉल करते समय my_random.randomरिसीवर (यानी वह वस्तु जिस पर विधि कहा जाता है) का rand विधि फिर से है my_random उदाहरण के बाद से यह वस्तु है self में MyRandom#random तरीका।

इसका परीक्षण करते समय, आप इस स्टब कर सकते हैं rand इस उदाहरण पर विधि:

describe MyRandom do
let(:subject) { described_class.new }

describe "#random" do
it "calls rand" do
expect(subject).to receive(:rand).and_return(12345)
expect(subject.random).to eq 12345
end
end
end