У меня есть функция, которая принимает блок, открывает файл, урожайность и возвращает:Как проверить функцию, которая принимает блок с 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
Трудно проверить это, потому что то, что вы хотите проверить, является внутренним для метода. Как ваш файл взаимодействует с чем-либо вне метода? В вашем примере вы вообще не используете файл вне метода, и вы его тоже не уступаете. Если что-то вне этой функции нуждается в файле, возможно, вам стоит рассмотреть возможность передачи объекта файла в метод (инъекция зависимостей). Тогда вы можете высмеять файл без проблем. Если вам нужно проверить что-то об этом файле, возможно, вам стоит рассмотреть возможность разбить его на отдельный метод? – Raj
Спасибо ... сделал что-то вроде этого, разбил на несколько методов, заколол несколько функций, таких как File.stub (open) .and_yield (my_double) и т. Д. – constantine1