Ruby 将Cookie与Rack::Test一起使用

Ruby 将Cookie与Rack::Test一起使用,ruby,cookies,rspec,sinatra,rack,Ruby,Cookies,Rspec,Sinatra,Rack,我正在尝试使用Rack::Test为我的Sinatra应用程序编写RSpec测试。我不明白我怎么能用饼干。例如,如果我的应用程序设置了cookie(不是通过:session),我如何检查cookie设置是否正确 另外,如何使用该cookie发送请求?Rack::Test保留了一个cookie jar,该cookie jar可以在请求上持久存在。您可以通过rack\u mock\u session.cookies访问它。假设您有这样一个处理程序: get '/cookie/set' do

我正在尝试使用Rack::Test为我的Sinatra应用程序编写RSpec测试。我不明白我怎么能用饼干。例如,如果我的应用程序设置了cookie(不是通过:session),我如何检查cookie设置是否正确


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

Rack::Test保留了一个cookie jar,该cookie jar可以在请求上持久存在。您可以通过
rack\u mock\u 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\u request.cookies
访问cookies,但正如名称所示,它包含最后一个请求的cookies,而不是响应。您可以使用
set_cookie
设置cookies,并使用
clear_cookies
清除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在测试用例中持续存在(
块),您需要在执行任何测试用例之前初始化机架会话。为此,请将此
添加到
描述
块的
挂钩之前

before :all do
    clear_cookies
end

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

好的,现在我看到cookie已正确设置,但当我请求路由需要有效cookie时,我得到了错误。(如果未设置cookie或cookie不正确,服务器返回401错误)UPD。rack_mock_session.cookie_jar[“foo”]不仅在一篇文章中是空的,在下一次测试中是空的.UPD。通过将cookie存储在全局变量中来解决问题,因此在每次请求之前我都会设置cookie。我用可能的问题解决方案更新了答案。让cookie jar在测试中持久化可能不是一个好主意,因为这样您的测试取决于它们的运行顺序(当单个测试中断时,您无法运行)。如果您需要在许多测试中执行相同的排列步骤(在您执行操作和断言之前),那么最好编写可以在
before:each
块中调用的helper方法。