Yal*_*don 5 ruby testing integration-testing ruby-on-rails railstutorial.org
我是一名 Rails 初学者,正在阅读 Michael Hartl 的 Rails 教程,但收到一个错误,我不知道如何修复。作为参考,这是为了实现清单 9.24 ( https://www.railstutorial.org/book/advanced_login ) 中的更改。
我跳过了第 9 章(因为它被认为是可选的)但在第 10 章中它要求包括清单 9.24 中所做的更改,所以我做了,但我的测试仍然失败。
这是我运行 rails test 时收到的错误
Error:
UsersEditTest#test_unsuccessful_edit:
NoMethodError: undefined method `session' for nil:NilClass
test/test_helper.rb:18:in `log_in_as'
test/integration/users_edit_test.rb:14:in `block in <class:UsersEditTest>'
bin/rails test test/integration/users_edit_test.rb:12
E
Error:
UsersEditTest#test_successful_edit:
NoMethodError: undefined method `session' for nil:NilClass
test/test_helper.rb:18:in `log_in_as'
test/integration/users_edit_test.rb:28:in `block in <class:UsersEditTest>'
Run Code Online (Sandbox Code Playgroud)
失败的测试(在 test/integration/users_edit_test.rb 中)是:
test "successful edit" do
log_in_as(@user)
get edit_user_path(@user)
... end
test "unsuccessful edit" do
log_in_as(@user)
get edit_user_path(@user)
... end
Run Code Online (Sandbox Code Playgroud)
这是正在调用的集成/test_helper 方法
# Log in as a particular user.
def log_in_as(user)
session[:user_id] = user.id
end
Run Code Online (Sandbox Code Playgroud)
特别令人困惑的是,测试助手中还有另一种方法也使用会话,并且在 user_login_test 中调用它可以正常工作。
任何帮助将不胜感激!!
小智 8
为了将来遇到这个问题的任何人的利益,对于集成测试,您需要定义一个 test_helper 方法,该方法发布到会话控制器创建方法,而不是专门修改会话,例如
class ActionDispatch::IntegrationTest
def log_in_as(user, password: 'password')
post login_path, params: { session: { email: user.email, password: password} }
end
end
Run Code Online (Sandbox Code Playgroud)
您的其他会话方法有效的原因是它没有为会话哈希分配任何内容,只是检查值是否存在。对于集成测试,您不能永久地直接修改会话哈希。
会话仅在测试用例中的第一次请求后可用。您的log_in_as(user)助手方法可以启动实际登录用户的请求,以便会话将填充user.id.
查看此线程中的讨论:
https://github.com/rails/rails/issues/23386#issuecomment-192954569