Rails Cookieテスト
2160 ワード
Rails Cookieテスト
from LetRails by
yuanyi
アクションでCookieを設定し、設定したcookieをテストしようとすると、トラブルが発生する可能性があります.次のコードを見てみましょう.
上記のテストを実行すると、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に置き換える簡単な方法です.たとえば、次のようにします.
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である.
したがって、[]=メソッドを使用してクッキーを設定しましたが、クッキーオブジェクトに[]と[]=メソッドが再ロードされているためです.
そのため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