无法理解水豚的行为
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')
其次,设置方法是在每次测试之前 运行 所以你真的不想在那里注册驱动程序,因为它只需要完成一次。
我的 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')
其次,设置方法是在每次测试之前 运行 所以你真的不想在那里注册驱动程序,因为它只需要完成一次。