如何在Rails 3中测试cookies.permanent.signed

Joa*_*ira 18 ruby-on-rails jrubyonrails ruby-on-rails-3

我在某个控制器中有一个动作,它在永久签名的cookie中设置了一些值,如下所示:


def some_action
    cookies.permanent.signed[:cookie_name] = "somevalue"
end

在一些功能测试中,我试图测试cookie是否设置正确起诉:


test "test cookies" do
    assert_equal "somevalue", cookies.permanent.signed[:cookie_name]
end


但是,当我运行测试时,我收到以下错误:


NoMethodError: undefined method `permanent' for #

如果我只尝试:


test "test cookies" do
    assert_equal "somevalue", cookies.signed[:cookie_name]
end


我明白了:


NoMethodError: undefined method `signed' for #

如何在Rails 3中测试签名的cookie?

bal*_*and 18

我在谷歌搜索类似问题的解决方案时遇到了这个问题,所以我将在这里发布.我希望在测试控制器操作之前在Rspec中设置一个已签名的cookie.以下工作:

jar = ActionDispatch::Cookies::CookieJar.build(@request)
jar.signed[:some_key] = "some value"
@request.cookies['some_key'] = jar[:some_key]
get :show ...
Run Code Online (Sandbox Code Playgroud)

请注意,以下内容不起作用:

# didn't work; the controller didn't see the signed cookie
@request.cookie_jar.signed[:some_key] = "some value"
get :show ...
Run Code Online (Sandbox Code Playgroud)


Ant*_*ric 8

在rails 3的ActionControlller :: TestCase中,您可以在请求对象中设置签名的永久cookie,如下所示 -

 @request.cookies.permanent.signed[:foo] = "bar"
Run Code Online (Sandbox Code Playgroud)

并且可以通过执行此操作来测试从控制器中执行的操作返回的签名cookie

 test "do something" do
     get :index # or whatever
     jar = @request.cookie_jar
     jar.signed[:foo] = "bar"
     assert_equal jar[:foo], @response.cookies['foo'] #should both be some enc of 'bar'
 end 
Run Code Online (Sandbox Code Playgroud)

请注意,我们需要设置已签名的Cookie jar.signed[:foo],但请阅读未签名的Cookie jar[:foo].只有这样我们才能获得cookie的加密值,这是比较所需的assert_equal.


Rog*_*vag 7

在查看处理此问题的Rails代码之后,我为此创建了一个测试助手:

  def cookies_signed(name, opts={})
    verifier = ActiveSupport::MessageVerifier.new(request.env["action_dispatch.secret_token".freeze])
    if opts[:value]
      @request.cookies[name] = verifier.generate(opts[:value])
    else
      verifier.verify(cookies[name])
    end
  end
Run Code Online (Sandbox Code Playgroud)

将其添加到test_help.rb,然后您可以使用以下命令设置已签名的Cookie:

cookies_signed(:foo, :value => 'bar')
Run Code Online (Sandbox Code Playgroud)

阅读它:

cookies_signed(:foo)
Run Code Online (Sandbox Code Playgroud)

可能有点hackish,但它为我做的工作.


Pol*_*rch 2

问题(至少在表面上)是在功能测试(ActionController::TestCase)的上下文中,“cookies”对象是一个哈希,而当您使用控制器时,它是一个 ActionDispatch::Cookies:: CookieJar 对象。因此我们需要将其转换为 CookieJar 对象,以便我们可以在其上使用“signed”方法将其转换为 SignedCookieJar。

您可以将以下内容放入功能测试中(在 get 请求之后),将 cookie 从 Hash 转换为 CookieJar 对象

@request.cookies.merge!(cookies)
cookies = ActionDispatch::Cookies::CookieJar.build(@request)
Run Code Online (Sandbox Code Playgroud)