如何在Rails 5的测试控制器中使用会话?

Leo*_*Leo 5 testing session ruby-on-rails

使用Rails4进行敏捷Web开发给出了如下示例测试代码:

carts_controller_test.rb

test "should destroy cart" do
  assert_difference('Cart.count', -1) do
    session[:cart_id] = @cart.id
    ...
Run Code Online (Sandbox Code Playgroud)

但是,当我在rails 5中尝试时

>>rake test
Run Code Online (Sandbox Code Playgroud)

引发错误

NoMethodError:nil:NilClass的未定义方法“会话”

如何在Rails 5的测试控制器中使用会话?还是我忽略了一些重要的配置?

Rob*_*ers 5

在Rails 5中,不再可以在控制器测试中访问会话:http : //blog.napcs.com/2016/07/03/upgrading-rails-5-controller-tests/。建议是访问将为您设置适当会话值的控制器方法。此注释显示了如何解决此限制的示例:https : //github.com/rails/rails/issues/23386#issuecomment-192954569

  # helper method
  def sign_in_as(name)
    post login_url, params: { sig: users(name).perishable_signature )
  end

class SomeControllerTest
  setup { sign_in_as 'david' }

  test 'the truth' do
  ..
Run Code Online (Sandbox Code Playgroud)


Leo*_*Leo 2

我在无法在 Rails 5 控制器测试中设置会话哈希中找到了答案

Rails5的测试控制器默认继承自ActionDispatch::IntegrationTest,而rails4的测试控制器默认继承自ActionController::TestCase。会话在 ActionDispatch::IntegrationTest 上下文中不可用。