ruby-on-rails - 使用 Capybara 和 Selenium 进行记录删除测试失败

标签 ruby-on-rails ruby selenium capybara

删除帖子记录的场景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 代码,程序似乎无法检测到记录已被删除。但是,如果我 sleep /等待一段时间,然后检查记录,程序现在检测到该记录已被删除,并且测试成功运行,因为一条记录已被删除。

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

最佳答案

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

至于 sleep 是必要的,那是(正如您猜测的)因为浏览器操作是异步发生的,这意味着一旦接受确认,接受确认就会返回。然后,您的服务器将需要一些时间来处理删除请求,并且在实际删除之前将检查 Post.count。要解决此问题,您应该检查是否有任何视觉变化表明已发生删除。在您的情况下,它看起来是文本“Post was successfully destroyed.”,因此请将其移至 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)

关于ruby-on-rails - 使用 Capybara 和 Selenium 进行记录删除测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65768838/

相关文章:

ruby - 有效地检查 JSON 响应是否包含数组中的特定元素

selenium - 无法使用 Selenium Webdriver click() 或 submit() 输入

ruby-on-rails - ActiveAdmin 排序

javascript - 为什么 jQuery $(document).ready() 在验证失败后没有在 Rails 渲染 View 中触发?

ruby - 在动画弹出窗口关闭后单击元素

java - Webdriver - 使用java获取div值

java - 类已由 Java 环境的更新版本编译

ruby-on-rails - Rails 断言的正则表达式以查看路径是否匹配

ruby-on-rails - 在 Rails 中制作条件 link_to 语句?

我可以覆盖用 C 编写的 Ruby 方法吗?