Это описание того, как создать вспомогательный метод в Rspec, взятый из книги Rspec (стр. 149). В этом примере предполагается, что существует метод, называемый «set_status», который запускается при создании объекта «Thing».Как использовать yield self в Rspec
Оба набора кода создают новый объект «Thing», устанавливают статус, а затем «fancy_stuff». Первый набор кода для меня совершенно ясен. Одно из выражений «it», которое оно вызвало, которое затем вызывает метод «create_thing» с параметрами. Создается новый объект «Вещь», и в качестве параметра вызывается метод «set_status» с атрибутом «options».
Второй набор кодов аналогичен. Вызывается одно из операторов «it», которое затем вызывает метод «given_thing_with» при передаче хэш-присвоения «: status» в качестве параметра. В методе «given_thing_with» срабатывает «выход», беря значение «Thing.new» в качестве параметра. Здесь я испытываю проблемы. Когда я пытаюсь запустить этот код, я получаю сообщение об ошибке «block given to yield». Я понимаю, что любые атрибуты, которые передаются с помощью yield, будут возвращены в «вещь» в скобке труб из оператора «it», называемого методом «given_thing_with». Я могу получить новый
Я не понимаю, почему код кода не вызывается в методе 'given_thing_with' после команды 'yield'. Другими словами, я не могу закодировать этот блок для запуска.
Заранее за вашу помощь.
Остальная часть этого вопроса цитируется непосредственно из книги RSpec:
describe Thing do
def create_thing(options)
thing = Thing.new
thing.set_status(options[:status])
thing
end
it "should do something when ok" do
thing = create_thing(:status => 'ok')
thing.do_fancy_stuff(1, true, :move => 'left', :obstacles => nil)
...
end
it "should do something else when not so good" do
thing = create_thing(:status => 'not so good')
thing.do_fancy_stuff(1, true, :move => 'left', :obstacles => nil)
...
end
end
Один идиома вы можете обратиться к приберёмся даже больше, чтобы дать себя от инициализаторах в ваших объектов. Если предположить, что метод вещь Initialize() делает это и set_status() не так, вы можете написать предыдущий, как это:
describe Thing do
def given_thing_with(options)
yield Thing.new do |thing|
thing.set_status(options[:status])
end
end
it "should do something when ok" do
given_thing_with(:status => 'ok') do |thing|
thing.do_fancy_stuff(1, true, :move => 'left', :obstacles => nil)
...
end
end
it "should do something else when not so good" do
given_thing_with(:status => 'not so good') do |thing|
thing.do_fancy_stuff(1, true, :move => 'left', :obstacles => nil)
...
end
end
end
'' Предполагая, что метод initialize() Thing делает это ... "'. Вы изменили реализацию инициализации Thing # так, чтобы она уступила? – zetetic
Спасибо, что ответили. Эта конкретная фраза, вероятно, та, которую я не понимаю. Я интерпретировал это как означающий «def initialize \ n yield \ n end», но это явно неправильно. Я прочитал этот пост [http://stackoverflow.com/questions/1425055/is-yield-self-the-same-as-instance-eval], чтобы узнать больше о передаче блоков. – Scott