Как проверить функцию, которая принимает блок с помощью rspec
У меня есть функция, которая принимает блок, открывает файл, возвращает и возвращает:
def start &block
.....do some stuff
File.open("filename", "w") do |f|
f.write("something")
....do some more stuff
yield
end
end
Я пытаюсь написать тест для этого с помощью rspec. Как мне заглушить File.open, чтобы он передавал объект f (предоставленный мной) блоку вместо того, чтобы пытаться открыть реальный файл? Что-то вроде:
it "should test something" do
myobject = double("File", {'write' => true})
File.should_receive(:open).with(&blk) do |myobject|
f.should_receive(:write)
blk.should_receive(:yield) (or somethig like that)
end
end
2 ответа
Я думаю, что вы ищете, сопоставления урожая, а именно:
it "should test something" do
# just an example
expect { |b| my_object.start(&b) }.to yield_with_no_args
end
Ваш другой выбор - заглушка: открыть с новым объектом File, как таковой:
file = File.new
allow(File).to receive(:open) { file }
file.each { |section| expect(section).to receive(:write) }
# run your method