在水豚的竞争条件

时间:2015-11-10 15:55:14

标签: javascript rspec capybara sleep race-condition

我认为当我访问某个页面时,我遇到了竞争条件,填写表格并在此之后访问另一页。这是完整的规范。

finally

即使describe "Dashboard", js: true do it 'should be displayed for logged in writer' do # sign_in visit '/login' within(".login-form") do fill_in 'login', with: 'existing_user@example.com' fill_in 'password', with: 'somepassword' end click_button 'LOGIN' # test itself visit '/dashboard' expect(page).to have_content 'Welcome back!' # sign_out visit '/dashboard' find('span', text: 'Logout').click end end 设置为default_max_wait_time,此测试也会失败。但它适用于15

sleep 1

有没有更好的方法来避免这种竞争条件?

1 个答案:

答案 0 :(得分:1)

点击“登录”按钮后,您需要等待显示登录已完成的更改。这是因为在支持JS的浏览器中异步发生,所有click_button都会点击按钮,它不会等待点击按钮所做的任何效果。所以你想要像

这样的东西
click_button 'LOGIN'
expect(page).to have_text('You are logged in')  # whatever text makes sense on your site
visit '/dashboard'
...

您正在显示的测试还有注销 - 但实际上并未确认用户已注销 - 因此它是测试中无用的部分