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

时间:2016-09-13 08:54:49

标签: ruby-on-rails session testing

使用Rails4进行敏捷Web开发提供了一个示例测试代码:

carts_controller_test.rb

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

然而,当我在rails 5中尝试这个时

>>rake test

引发错误

  

NoMethodError:未定义的方法`session'对于   零:NilClass

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

3 个答案:

答案 0 :(得分:4)

在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
  ..

答案 1 :(得分:2)

我在Unable to set session hash in Rails 5 controller test

中找到了答案

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

答案 2 :(得分:-3)

以下代码有效:

delete cart_url(@cart), params: { 'session' => { :cart_id => @cart.id }}