我认为当我访问某个页面时,我遇到了竞争条件,填写表格并在此之后访问另一页。这是完整的规范。
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
有没有更好的方法来避免这种竞争条件?
答案 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'
...
您正在显示的测试还有注销 - 但实际上并未确认用户已注销 - 因此它是测试中无用的部分