Rspec:将测试组定义为接受参数的方法

时间:2013-12-15 21:49:08

标签: ruby-on-rails ruby rspec

说,我有这样的测试:

  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中定义自定义匹配器,但我们如何定义测试呢?

3 个答案:

答案 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/