【问题标题】:What is the correct usage of capybara's within method?capybara的with方法的正确用法是什么?
【发布时间】:2016-02-07 16:10:26
【问题描述】:

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

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

如果您仔细观察,我在每个场景中都重复了“内部”,这与代码干涩相冲突。

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

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

【问题讨论】:

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


    【解决方案1】:

    没有办法让#within 的使用枯竭,仍然有多个场景。有人可能会尝试使用环绕过滤器,但由于环绕过滤器和前后过滤器的顺序,它并不能真正起作用。您可以在不使用 #within 的情况下获得所需的内容,方法是在 before 块中找到页脚,然后期待它

    before do
      visit('my page')
      @footer = find('footer')
    end
    
    scenario 'blah blah' do
      expect(@footer).to have_content('...')
    end
    

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

    【讨论】:

    • 谢谢汤姆。您能否解释一下视图测试和功能测试之间的一些区别?我认为这些是相同的:|
    • 顺便问一下,我在这里问了一个单独的问题:stackoverflow.com/questions/35258592/…
    • +1 表示“编写功能测试只是为了检查页面上的一行文本不是很好的做法” ...尤其是当“检查不依赖于任何用户操作的文本行时.
    【解决方案2】:

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

    例如:

    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
    

    【讨论】:

    • 谢谢。但我想为他们每个人单独解释一下
    • capybara 方法提供的解释不够吗? to have_content "Copyright" 相对具有描述性。我不确定“有版权文本”是否会增加很多解释。
    • 当您使用 rspec 命令的 -f d 开关运行示例时,水豚的方法不会出现,对吗?我想要那个打印在外壳上的解释。
    • 我编辑了答案,在场景方法中包含更多描述性文本,以便您在测试运行时看到信息。
    • 哈哈......这种方式是一种棘手且可以接受的方式。编辑:原则是对示例使用简短描述
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 2021-11-24
    • 2021-09-23
    • 2017-04-07
    • 2013-01-09
    • 2013-03-19
    相关资源
    最近更新 更多