18

次のような永続的な署名付き 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をテストするには?

4

5 に答える 5

18

同様の問題の解決策をグーグルで検索しているときにこの質問に出くわしたので、ここに投稿します。コントローラーのアクションをテストする前に、署名付き Cookie を Rspec に設定したいと考えていました。以下が機能しました:

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

以下は機能しなかったことに注意してください。

# didn't work; the controller didn't see the signed cookie
@request.cookie_jar.signed[:some_key] = "some value"
get :show ...
于 2011-07-18T03:59:24.640 に答える
8

Rails 3 の ActionControllerller::TestCase では、次のようにリクエスト オブジェクトに署名済みの永続的な Cookie を設定できます -

 @request.cookies.permanent.signed[:foo] = "bar"

また、コントローラーで実行されたアクションから返された署名付き 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 

signed cookie を設定する必要がありjar.signed[:foo]ますが、 unsigned cookie を読み取る必要があることに注意してくださいjar[:foo]。そうして初めて、 での比較に必要な cookie の暗号化された値を取得しassert_equalます。

于 2011-03-30T06:08:12.453 に答える
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

これを test_help.rb に追加すると、署名付き Cookie を次のように設定できます。

cookies_signed(:foo, :value => 'bar')

そしてそれを読んでください:

cookies_signed(:foo)

少しハックかもしれませんが、それは私にとってはうまくいきます。

于 2012-02-01T10:24:39.883 に答える
2

問題 (少なくとも表面上) は、機能テスト (ActionController::TestCase) のコンテキストでは、「cookies」オブジェクトがハッシュであるのに対し、コントローラーで作業する場合は ActionDispatch::Cookies:: であるということです。 CookieJar オブジェクト。そのため、「署名済み」メソッドを使用して SignedCookieJar に変換できるように、CookieJar オブジェクトに変換する必要があります。

クッキーをハッシュから CookieJar オブジェクトに変換するために、(get リクエストの後) 機能テストに以下を入れることができます。

@request.cookies.merge!(cookies)
cookies = ActionDispatch::Cookies::CookieJar.build(@request)
于 2011-03-02T22:09:53.680 に答える
0

問題はあなたのテストにもあるようです。

これは、パラメータ値をビューに渡すことからCookieの値を設定する状況をTDDするために使用したいくつかのコードとテストです。

機能テスト:

test "reference get set in cookie when visiting the site" do
  get :index, {:reference => "121212"}
  refute_nil cookies["reference"]
end

SomeController:

before_filter :get_reference_code

ApplicationController:

def get_reference_code
  cookies.signed[:reference] ||= params[:reference]
end

refute_nil行、cookiesが文字列であることに注意してください...これもこのテストに合格しなかった理由の1つでありcookies[:reference]、テストに記号を入れるのが気に入らなかったので、私はそれをしませんでした。

于 2011-08-06T11:48:33.773 に答える