Javascript 水豚的竞争条件

Javascript 水豚的竞争条件,javascript,rspec,capybara,sleep,race-condition,Javascript,Rspec,Capybara,Sleep,Race Condition,我想当我访问某个页面、填写表格并在此之后访问另一个页面时,我已经满足了竞争条件。这是完整的规格 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

我想当我访问某个页面、填写表格并在此之后访问另一个页面时,我已经满足了竞争条件。这是完整的规格

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\u max\u wait\u time
设置为
15
,此测试仍失败。但是,它适用于
睡眠1

# test itself
sleep 1
visit '/dashboard'
expect(page).to have_content 'Welcome back!'

有没有更好的方法来避免这种竞争状况?

单击“登录”按钮后,您需要等待显示登录已完成的更改。这是因为在支持JS的浏览器中,事情是异步发生的,
click\u button
所做的一切都是单击按钮,而不是等待任何效果单击按钮。所以你想要像这样的东西

click_button 'LOGIN'
expect(page).to have_text('You are logged in')  # whatever text makes sense on your site
visit '/dashboard'
...
此外,您正在显示的测试已经注销,但实际上并没有确认用户已注销,因此这是测试中一个无用的部分