如何在rspec中存根rand?

the*_*ing 7 ruby rspec

我正在使用Ruby 2.3.4和rspec 3.6.0.

我正在为一个使用的对象编写测试rand(10000..99999).我找不到任何文档rand来查看它所属的对象.我尝试了stubbing Kernel,ObjectRandom(见下文),但我的尝试都没有导致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)
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏.

Hol*_*ust 10

rand确实是在Kernel模块中实现的.但是,在代码中调用方法时,方法接收器实际上是您自己的对象.

假设以下课程:

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

my_random = MyRandom.new
my_random.random
# => 56789
Run Code Online (Sandbox Code Playgroud)

在调用时my_random.random,方法的接收器(即,调用该方法的对象)rand也是my_random实例,因为这是selfMyRandom#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
Run Code Online (Sandbox Code Playgroud)


Jer*_*ert 5

这有效:

allow_any_instance_of(Object).to receive(:rand).and_return(12345)
Run Code Online (Sandbox Code Playgroud)