【问题标题】:Record Deletion testing failure using Capybara with Selenium使用 Capybara 和 Selenium 记录删除测试失败
【发布时间】:2021-01-18 04:27:47
【问题描述】:

我的场景posts_spec 文件中的删除 Post 记录如下所示:

注意:我已将默认的transactional fixture属性设置为false,因此删除场景中可以使用Post记录 之前在创建场景中创建的。

RSpec.feature "Signing Post", type: :feature, driver: :selenium_chrome do
  
  scenario "Create Post" do
    ......
  end

  scenario "Delete Post" do
      visit '/posts'
      expect{
        within 'table' do
          accept_confirm do
            find_link(class: ['tester']).click
          end
 
          # When not using sleep, the Post.count is not changed and remains the same
          sleep(1)
    
        end
      }.to change {Post.count}.by(-1)

      expect(page).to have_content("Post was successfully destroyed.")

    end
end

问题: 如您所见,我在代码中使用了 sleep(1)。这样做的原因是,没有睡眠代码,程序似乎没有检测到记录已被删除。但是如果我休眠/等待一段时间,然后检查记录,程序现在检测到记录已被删除,并且测试成功运行,因为一条记录已被删除。

是否因为 accept_confirm 操作需要一些时间来处理,并且我们必须等待确认被接受,然后在声明数据库中的任何类型的更改之前删除记录?

【问题讨论】:

标签: ruby-on-rails ruby selenium capybara


【解决方案1】:

首先,最佳做法是让您的所有场景都是独立的,这样它们就可以按任何顺序运行。您选择忽略此处的最佳实践,并使场景顺序依赖 - 希望您有充分的理由这样做。

至于睡眠是必要的,那是(正如您所推测的那样)因为浏览器操作异步发生,这意味着一旦接受确认,接受确认就会返回。然后,您的服务器将需要一些时间来处理删除请求,并且在实际发生删除之前将检查Post.count。要解决这个问题,您应该检查是否有任何视觉变化表明已发生删除。在您的情况下,这看起来是文本“帖子已成功销毁。”,因此将其移动到 Post.count 期望中,以便将您的测试与应用程序同步。

expect{
    within 'table' do
      accept_confirm do
        find_link(class: 'tester').click
      end 
    end

    expect(page).to have_content("Post was successfully destroyed.")
  }.to change {Post.count}.by(-1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    相关资源
    最近更新 更多