我有这样的规格:
it "creates a new deal"
# visit 'new' page
# use capybara to fill out lots of form fields and hit submit
# test all the values of the created Deal object
end
我希望我的下一个规范能够测试it "redirects to the show page for the newly created deal"
,如果它可以从上一个规范遗留下来的地方测试current_path
,我很喜欢。
有没有办法说“运行其他规范,然后再添加这些期望”?而不是粘贴其他规格的所有方向。
答案 0 :(得分:1)
您还可以在规范中使用共享的示例来重用它。
Rspec.shared_examples "submits a new deal" do |needed_params|
# visit 'new' page
# use capybara to fill out lots of form fields and hit submit
it "has the correct values" do
# test all the values of the created Deal object
end
end
在您的代码中,您可以在嵌套上下文中重用它,例如:
it_behaves_like "submits a new deal", "params1"
或使用以下命令将其包含在当前上下文中:
include_examples "submits a new deal", "params"
请参阅:https://relishapp.com/rspec/rspec-core/docs/example-groups/shared-examples
答案 1 :(得分:0)
我更喜欢将这些行为分组在一个模块中,并将其包含在我的功能规范中。
在您的情况下,我将创建一个spec/features/common.rb
模块
# frozen_string_literal: true
module Features
module Common
def submit_new_deal
# visit 'new' page
# use capybara to fill out lots of form fields and hit submit
end
end
像这样将其包含在spec/rails_helper.rb
中:
# Include common functionality for features
config.include Features::Common, type: :feature
最后在功能规格中重新使用它:
it "creates a new deal"
submit_new_deal
# test all the values of the created Deal object
end
答案 2 :(得分:0)
我希望我的下一个规范测试它“是否重定向到 新达成的交易”,我很想知道它是否可以在哪里 最后一个规范不再使用并测试current_path。
您可以使用shared contexts来共享设置步骤,让块等。
RSpec.shared_context "authenticated" do
let(:user){ create(:user) }
before do
login_as(user, scope: :user)
end
end
如果您需要在多种情况下测试相同的行为,也可以使用shared examples。
RSpec.shared_examples "requires authentication" do
before { do_request }
it "redirects the user to the login page" do
expect(response).to redirect_to('/login')
end
end
但是运行相同的规范只是为了设置测试状态将是一个很慢的解决方案。测试一次,然后使用factory / stubs设置依赖项以用于以后的测试。