使用 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)
我的场景删除一条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)