在集成测试中访问会话

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)

您的其他会话方法有效的原因是它没有为会话哈希分配任何内容,只是检查值是否存在。对于集成测试,您不能永久地直接修改会话哈希。


Wil*_*ias 5

会话仅在测试用例中的第一次请求后可用。您的log_in_as(user)助手方法可以启动实际登录用户的请求,以便会话将填充user.id.

查看此线程中的讨论:

https://github.com/rails/rails/issues/23386#issuecomment-192954569