Як усунути rand в rspec? - рубій, rspec

Я використовую Ruby 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