У меня есть общий пример в RSpec, который проверяет отправку SMS. В моем приложении у меня есть несколько методов, которые отправляют SMS, поэтому я хотел бы параметризовать код, который я тестирую, чтобы я мог использовать свой общий пример для всех моих методов. Единственный способ сделать то, что я обнаружил, это использовать функцию eval
:
RSpec.shared_examples "sending an sms" do |action_code|
it "sends an sms" do
eval(action_code)
expect(WebMock).to have_requested(**my_request**).with(**my_body**)
end
end
Так что я могу использовать этот пример так:
it_behaves_like "sending an sms",
"post :accept, params: { id: reservation.id }"
it_behaves_like "sending an sms",
"post :create, params: reservation_attributes"
Как этого добиться без использования функции eval
? Я попытался использовать шаблон с командой yield
, но он не работает из-за области действия:
Ошибка / Ошибка: post: create, params: rout_attributes
reservation_attributes
недоступно для группы примеров (например, блок describe
или context
). Он доступен только из отдельных примеров (например, it
блоков) или из конструкций, которые выполняются в рамках примера (например, before
, let
и т. Д.).