无法理解水豚的行为

我对我的Rails应用程序进行了这种集成测试:

require 'test_helper' class StudyCapybaraTest  :chrome) end Capybara.current_driver = :selenium_chrome #Capybara.default_wait_time = 5 visit login_path fill_in "session_email", with: @user.email fill_in "session_password", with: 'password' click_button "session_commit" end test "full study process" do assert_title "Home | Word Up" visit study_user_path(@user) .... end end 

奇怪的是,当我删除第一个测试的第一行“完整的学习过程”

assert_title "Home | Word Up"

测试失败,因为测试用户似乎没有登录。移动时会出现同样的问题

visit study_user_path(@user)

进入设置function(就像之前一样)。

但这并没有改变序列和逻辑,对吧? 我唯一能想到的是,断言来得很早,应用程序没有时间执行满足断言所需的指令。

这是一个时间问题,如果是这样,我怎样才能防止它们在将来发生? 谢谢!

首先,你对它的直觉是一个时间问题是正确的。 click_button就是这样 – 它点击按钮。 它不会等待表单发布,它不会等待任何ajax发生等等。因此,如果没有assert_title,您的测试是单击按钮,并立即更改浏览器中的URL。 更改浏览器中的URL将具有取消由click_button调用触发的任何表单提交或行为的效果。 你需要在click_button之后等待页面上因为单击按钮而在页面上发生变化的内容

 assert_text('You are now logged in') 

其次,setup方法在每次测试之前运行,所以你真的不想在那里注册驱动程序,因为它只需要完成一次。