使用 Selenium 的 Capybara 记录删除测试失败

Record Deletion testing failure using Capybara with Selenium

我的场景删除一条Post记录看起来像这样在 posts_spec 文件中:

注意: 我已将默认的 事务固定装置 属性 设置为 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)。这样做的原因是,没有睡眠代码,程序似乎没有检测到记录已被删除。但是如果我sleep/wait一段时间,然后检查记录,程序现在检测到记录已被删除,并且测试成功,因为删除了一条记录。

是不是因为accept_confirm这个action需要一些时间来处理,要等confirm被accepted然后record被删除才可以断言数据库有什么变化吗?

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

至于睡眠是必要的,那是(正如您所猜测的)因为浏览器操作是异步发生的,这意味着一旦确认被接受就接受确认 returns。然后,您的服务器将需要一些时间来处理删除请求,并且 Post.count 将在删除实际发生之前进行检查。要解决此问题,您应该检查指示删除已发生的任何视觉变化。在你的情况下,看起来是文本“Post 已成功销毁。”,因此将其移动到 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)