Как сделать общий пример с RSpec с параметризованным кодом для тестирования без использования метода eval? - PullRequest
0 голосов
/ 07 мая 2018

У меня есть общий пример в 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 и т. Д.).

1 Ответ

0 голосов
/ 07 мая 2018

На самом деле в вашем случае действие и параметры могут быть переданы в качестве аргументов в общие примеры:

RSpec.shared_examples "sending an sms" do |action, params|
  it "sends an sms" do
    post action, params: params
    expect(WebMock).to have_requested(**my_request**).with(**my_body**)
  end
end

И называется как:

it_behaves_like "sending an sms", :accept, { id: reservation.id }

it_behaves_like "sending an sms", :create, reservation_attributes

Или вы можете определить отдельное действие для каждого блока

RSpec.shared_examples "sending an sms" do
  it "sends an sms" do
    action
    expect(WebMock).to have_requested(**my_request**).with(**my_body**)
  end
end

it_behaves_like "sending an sms" do
  let(:action) { post :accept, params: { id: reservation.id } }
end

it_behaves_like "sending an sms" do
  let(:action) { post :create, params: reservation_attributes }
end
...