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)
在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.
在查看处理此问题的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,但它为我做的工作.
问题(至少在表面上)是在功能测试(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)
| 归档时间: |
|
| 查看次数: |
6346 次 |
| 最近记录: |