无法理解水豚的行为

Can't make sense of capybara behaviour

我的 Rails 应用程序有这个集成测试:

require 'test_helper'

class StudyCapybaraTest < ActionDispatch::IntegrationTest
  def setup
    @user = users(:archer)
    @vocabs = @user.vocabs
    Capybara.register_driver :selenium_chrome do |app|
      Capybara::Selenium::Driver.new(app, :browser => :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

奇怪的是,当我删除第一个测试的第一行时 "full study process"

assert_title "Home | Word Up"

测试失败,因为测试用户好像没有登录,我搬家也出现同样的问题

visit study_user_path(@user)

进入设置函数(和以前一样)。

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

这是时间问题吗?如果是,我该如何防止它们在未来发生?谢谢!

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

assert_text('You are now logged in')

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