使用Cookies与Rack :: Test

时间:2011-03-17 05:20:41

标签: ruby cookies rspec sinatra rack

我正在尝试使用Rack :: Test为我的Sinatra应用程序编写RSpec测试。我无法理解如何使用cookies。例如,如果我的应用程序设置了cookie(不是通过:session),我该如何检查该cookie是否正确设置?

另外,如何使用该cookie发送请求?

1 个答案:

答案 0 :(得分:19)

Rack :: Test会保留一个持久存储请求的cookie jar。您可以使用rack_mock_session.cookies访问它。假设您有这样的处理程序:

get '/cookie/set' do
    response.set_cookie "foo", :value => "bar"
end

现在你可以用这样的东西来测试它:

it 'defines a cookie' do
    get '/'
    rack_mock_session.cookie_jar["foo"].should == "bar"
end

您还可以使用last_request.cookies访问Cookie,但正如其名称所示,它包含上次请求的Cookie,而不是响应。您可以使用set_cookie设置Cookie并使用clear_cookies清除它们。

it 'shows how to set a cookie' do
   clear_cookies        
   set_cookie "foo=quux"
   get '/'
   last_request.cookies.should == {"foo" => "quux"}
end

更新:如果您希望cookie jar在测试用例(it块)中保持不变,则需要在执行任何测试用例之前初始化Rack会话。为此,请将此before挂钩添加到describe块。

before :all do
    clear_cookies
end

或者,您可以使用before :each在每次请求之前设置必要的Cookie。