2011-03-17 34 views
12

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

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

回答

16

Rack :: Test保留了一个cookie jar,它保留了请求。您可以通过rack_mock_session.cookies访问它。比方说,你有一个这样的处理程序:

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

您也可以访问饼干last_request.cookies,但正如其名字所示,它包含:

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

现在你可以用这样的测试cookies的最后请求,而不是响应。您可以使用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 

更新:如果你想饼干罐跨越测试用例(it块)仍然存在,则需要执行任何测试用例之前初始化机架会议。为此,请将此before挂钩添加到您的describe块。

before :all do 
    clear_cookies 
end 

替代,例如,你可以使用before :each每个请求之前设置必要的饼干。

+0

好的,现在我看到cookie已正确设置,但是当我请求路由时需要有效的cookie - 我得到了错误。 (如果cookie未设置或不正确,则服务器返回401错误) – Andoriyu 2011-03-18 06:49:09

+0

UPD。 rack_mock_session.cookie_jar [“foo”]只在一篇文章中为空,在下一次测试中它是空的。 – Andoriyu 2011-03-18 06:57:24

+0

UPD。通过在全局变量中存储cookie来解决问题,所以在每次请求之前设置cookie。 – Andoriyu 2011-03-18 07:00:59