方法中的水豚的正确用法是什么?

时间:2016-02-07 16:10:27

标签: ruby-on-rails capybara rspec-rails

对于页脚的功能示例,我使用了此代码:

feature 'in footer' do
    scenario "has a Copyright text" do
      within('footer') {
        expect(page).to have_content "Copyright"
      }
    end

    scenario "has navigation bar" do
      within('footer') {
        expect(page).to have_selector 'nav ul li'
      }
    end

    scenario "has a link for 'About'" do
      within('footer') {
        expect(page).to have_link 'About', href: '#'
      }
    end
end

如果仔细观察,我会重复"""在每个场景中,这与代码的干燥相冲突。

我不想在一个场景中包含所有期望,因为我想要对每个场景进行解释。

在这种情况下使用within方法的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

您可以创建一个方法来消除重复的方法。

例如:

feature 'footer' do
  scenario 'footer has copyright text, navigation bar and link for about' do
    within('footer') {
       expect(page).to have_content "Copyright"
       expect(page).to have_selector 'nav ul li'
       expect(page).to have_link 'About', href: '#'
    }
  end
end

答案 1 :(得分:1)

没有办法干掉#within的使用,但仍有多种情况。有人可能会尝试使用around过滤器,但由于周围和过滤器之前/之后的排序,它实际上不会起作用。你可以在不使用#within的情况下获得你正在寻找的东西,通过找到前一个块中的页脚然后期望它

before do
  visit('my page')
  @footer = find('footer')
end

scenario 'blah blah' do
  expect(@footer).to have_content('...')
end

我会说,编写功能测试只是为了检查页面上的一行文字并不是很好的做法。功能测试有很多开销,检查不依赖于任何用户操作的文本行更适合于视图测试而不是功能(您仍然可以在视图测试中使用Capybaras匹配器)。功能测试应该用于测试系统中较大的行为。