我认为访问某个页面,填写表格并在此之后访问另一个页面时已经满足了比赛条件。这是完整规格。

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: '[email protected]'
      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

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


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

最佳答案

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

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


另外,您显示的测试已注销-但实际上并未确认用户已注销-因此这是测试的无用部分

关于javascript - capybara 的种族状况,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33634141/

10-14 12:18