从rails

时间:2017-11-08 20:44:55

标签: ruby-on-rails cookies

我正在通过https://www.railstutorial.org/的第9章工作,并且遇到集成测试时遇到了麻烦。

测试如下:

class UsersLoginTest < ActionDispatch::IntegrationTest
  ...
  test "login with remembering" do
    log_in_as(@user, remember_me: '1')
    assert_not_empty cookies['remember_token']
  end
  ...
end

对log_in_as的调用是在test_helper中添加到ActionDispatch :: IntegrationTest的函数,并且似乎按预期工作。这个函数的一个副作用是名为&#39; remember_token&#39;得到了设定。但是,断言失败并显示以下消息:

FAIL["test_login_with_remembering", UsersLoginTest, 14.115229932998773]
test_login_with_remembering#UsersLoginTest (14.12s)
    Expected nil (NilClass) to respond to #empty?.
    test/integration/users_login_test.rb:48:in `block in <class:UsersLoginTest>'

知道这里发生了什么吗?在调试器中运行测试似乎表明cookie对象不包含任何看起来像我期望的东西(我在应用程序中设置了几个cookie,并且它们都没有出现)。所有谷歌出现的都是一群人建议在集成测试中访问cookie是个坏主意。如果有帮助的话,我正在运行Rails 5.1.2。

1 个答案:

答案 0 :(得分:0)

Rails的早期版本改变了行为,Rails教程似乎由于旧版本的Rails而被弃用。

要通过测试,您可以忘记以下帮助程序:

class UsersLoginTest < ActionDispatch::IntegrationTest

  ...

  test "remember if checked in login" do
    post login_path, params: { session: { email: @user.email, password: "password", remember_me: '1'}}
    assert_not_empty cookies[:remember_token]
  end

  test "no remember if not checked in login" do
    post login_path, params: { session: { email: @user.email, password: "password", remember_me: '1'}}
    post login_path, params: { session: { email: @user.email, password: "password", remember_me: '0'}}
    assert_empty cookies[:remember_token]
  end

  ...

end