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 № 1rand
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