我的班级有一个#run方法,到目前为止,它只是测试测试:
def run
puts "Enter 'class' to create a new class."
input = $stdin.gets.chomp
binding.pry
到目前为止,在测试中我已经获得
allow($stdin).to receive(:gets).and_return 'class'
cli.run
通过这种方式,我可以在窥探会话中看到input
已按照预期设置为'class'
。
有没有一种方法可以在我的方法本身对$stdin
的调用中不添加gets
?即input = gets.chomp
我已经尝试过allow(cli.run).to receive(:gets).and_return 'class'
但随后在撬动会话中,input
等于spec文件的第一行!
答案 0 :(得分:1)
您可以避免这种情况:
def run
puts "Enter 'class' to create a new class."
input = gets.chomp
end
describe 'gets' do
it 'belongs to Kernel' do
allow_any_instance_of(Kernel).to receive(:gets).and_return('class')
expect(run).to eq('class')
end
end
方法gets
实际上属于Kernel
模块。 (method(:gets).owner == Kernel
)。由于Kernel
中包含Object
,几乎所有的ruby对象都从Object
继承,因此可以使用。
现在,如果run
是Class
范围内的实例方法,我建议对存根进行更多的范围界定,以使:
class Test
def run
puts "Enter 'class' to create a new class."
input = gets.chomp
end
end
describe 'gets' do
it 'can be stubbed lower than that' do
allow_any_instance_of(Test).to receive(:gets).and_return('class')
expect(Test.new.run).to eq('class')
end
# or even
it 'or even lower than that' do
cli = Test.new
allow(cli).to receive(:gets).and_return('class')
expect(cli.run).to eq('class')
end
end