我正在使用Ruby 2.3.4和rspec 3.6.0.
我正在为一个使用的对象编写测试rand(10000..99999)
.我找不到任何文档rand
来查看它所属的对象.我尝试了stubbing 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)
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
实例,因为这是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
Run Code Online (Sandbox Code Playgroud)
这有效:
allow_any_instance_of(Object).to receive(:rand).and_return(12345)
Run Code Online (Sandbox Code Playgroud)