删除帖子记录的场景在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/