说,我有这样的测试:
describe "signin" do
before { visit root_path }
describe "with invalid data" do
before { click_button "Sign in" }
it { should have_error_message("Invalid") }
it { should_not have_link("Sign out") }
it "should redirect to same page" do
current_path.should == root_path
end
end
end
我希望在任何其他页面中执行相同的测试(不是root_path
):它应该被重定向到同一页面。
所以,我想保持DRY,因此要在一个地方声明这个测试,并用不同的参数调用它:首先使用root_path
,然后使用其他页面。
我知道我们可以在support/utilities.rb
中定义自定义匹配器,但我们如何定义测试呢?
答案 0 :(得分:1)
我会使用Shared example group。 E.g。
shared_examples_for "redirect and show error" do
it { should have_error_message("Invalid") }
it { should_not have_link("Sign out") }
it "should redirect to same page" do
current_path.should == root_path
end
end
describe "signin" do
before { visit root_path }
describe "with invalid data" do
before { click_button "Sign in" }
it_behaves_like "redirect and show error"
end
end
答案 1 :(得分:1)
如果我正确理解你的问题,你想要执行相同的代码,但是当前root_path
的值不同(即你会访问其他路径并重定向到其他路径)输入的数据无效。)
在这种情况下,您需要provide context to a shared example
shared_examples_for "visit and click sign in" do
before do
visit path
click_button "Sign in"
end
it { should have_error_message("Invalid") }
it { should_not have_link("Sign out") }
it "should redirect to same page" do
current_path.should == path
end
end
describe "root signin" do
it_behaves_like "visit and click sign in" do
let(:path) {root_path}
end
end
你不能只传入root_path
因为shared_examples
的参数在RSpec的上下文中被评估,而不是“测试环境”。
答案 2 :(得分:0)
您可以使用custom example groups
:
http://benediktdeicke.com/2013/01/custom-rspec-example-groups/