/ / Comment stub rand dans rspec? - rubis, rspec

Comment stub rand dans rspec? - rubis, rspec

J'utilise Ruby 2.3.4 et rspec 3.6.0.

Je suis en train d’écrire un test pour un objet qui utilise rand(10000..99999). Je ne peux trouver aucun document sur rand pour voir de quel objet il fait partie. Kernel, Object, et Random (voir ci-dessous) mais aucune de mes tentatives n'a abouti à rand être écrasé pour l'objet.

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

Toute aide est appréciée.

Réponses:

5 pour la réponse № 1

rand est en effet mis en œuvre dans le Kernel module. Cependant, lorsque vous appelez la méthode dans votre code, le récepteur de la méthode est en réalité votre propre objet.

Supposons la classe suivante:

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

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

En appelant my_random.random, le destinataire (c’est-à-dire l’objet sur lequel la méthode est appelée) de la rand la méthode est encore la my_random par exemple puisque c'est l'objet étant self dans le MyRandom#random méthode.

Lorsque vous testez cela, vous pouvez utiliser ce bouton rand méthode sur cette instance:

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