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'
...
此外,您正在显示的测试已经注销,但实际上并没有确认用户已注销,因此这是测试中一个无用的部分