4

我已经为我的 rails 3.2 应用程序编写了一些 RSpec 测试,因为我对弹出的浏览器感到厌烦,我试图从 firefox 更改为capybara-webkit. 在此之后,所有测试仍然运行,除了一个。失败的行是:

expect { click_button "Create" }.to change(Answer, :count).by(count)

如果我删除期望并在前后添加一个截屏方法,我可以看到测试运行正确。但是,如果我使用 Debugger,日志会显示记录是在第二个屏幕截图行之后创建的。我可以永远等待 click_button 和相应的控制器动作在下一行执行后运行。

“创建”按钮是一个标准的 html 按钮,创建动作不涉及任何 JS。某人对这种奇怪的行为有解释吗?

4

1 回答 1

6

Capybara 将点击操作发送到服务器和您的测试检查数据库之间存在竞争条件。

解决此问题的最简单方法是在检查之前等待:

expect { click_button "Create"; sleep 2 }.to change(Answer, :count).by(count)

我不喜欢这个。更好的测试方法是从最终用户的角度进行检查。

例如,单击“创建”后,用户是否在答案页面上看到答案?

fill_in :title, :with => "My answer"

click_button 'Create'

page.should have_text "My answer"
于 2012-07-13T23:19:12.053 回答