Rails Cookieテスト

2160 ワード

Rails Cookieテスト
from LetRails by
yuanyi
アクションでCookieを設定し、設定したcookieをテストしようとすると、トラブルが発生する可能性があります.次のコードを見てみましょう.class CookiesController
  def update
    cookies[:name] = 'demo'
  end
end
describe CookiesController
  it "should update cookies[:name] to 'demo'" do
    request.cookies[:name] = 'test'
    put :update
    request.cookies[:name].should == 'demo'
  end
end

上記のテストを実行すると、expected「demo」got「test」が得られます.これはどういうことですか.クッキーの設定に失敗しましたか.実際には、RailsのCookieメカニズムを理解していないため、まずrequest.cookiesとControllerのcookiesを区別する必要があります.request.cookiesはクライアントが送信したcookieをシミュレートするために使用され、Hash対象であるため、hashのように使用することができます.
>> request.cookies[:name] = ‘test’ >> request.cookies[:name] test
しかし、Controllerのcookiesは異なり、ActionController::CookieJarオブジェクトであり、このcookiesオブジェクトは実際に2つのcookieセット:incoming cookieとoutgoing cookieを保存している.incoming cookieは、クライアントリクエストに持ち込まれたcookie(すなわちrequest.cookies)であり、outgoing cookieは、リクエスト処理が完了するとクライアントに設定されるcookieである.
したがって、[]=メソッドを使用してクッキーを設定しましたが、クッキーオブジェクトに[]と[]=メソッドが再ロードされているためです.
  • []メソッドは、incomingクッキー、すなわちrequestに携帯するクッキー
  • を返す.
  • で[]=メソッドが設定されているのはoutgoingクッキーであり、次のリクエストにのみ機能します.すなわち、次のリクエストのincomingクッキーに含まれます.

  • そのためcontroller cookiesを設定すると、次のようなものしか得られません.
    >> cookies[:name] = ‘test’ >> cookies[:name] nil
    cookiesが正常に設定されているかどうかをテストする必要がある場合は、controllerのcookiesをhashに置き換える簡単な方法です.たとえば、次のようにします.
    describe CookiesController
      it "should update cookies[:name] to 'demo'" do
        request.cookies[:name] = 'test'
        @cookies = {}
        controller.stub!(:cookies).and_return(@cookies)
        put :update
        @cookies[:name].should == 'demo'
      end
    end