使用Cookies与Rack :: Test

And*_*iyu 13 ruby cookies rack rspec sinatra

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

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

Mii*_*kka 19

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

get '/cookie/set' do
    response.set_cookie "foo", :value => "bar"
end
Run Code Online (Sandbox Code Playgroud)

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

it 'defines a cookie' do
    get '/'
    rack_mock_session.cookie_jar["foo"].should == "bar"
end
Run Code Online (Sandbox Code Playgroud)

您也可以访问cookie last_request.cookies,但顾名思义,它包含最后一个请求的cookie,而不是响应.您可以设置cookie set_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
Run Code Online (Sandbox Code Playgroud)

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

before :all do
    clear_cookies
end
Run Code Online (Sandbox Code Playgroud)

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

  • 让cookie jar在测试中持续存在可能不是一个好主意,因为那时你的测试依赖于它们运行的​​顺序(并且当它们中断时你不能运行单独的测试).如果你需要在许多测试中(在_act_和_assert_之前)执行相同的_arrange_步骤,那么你最好编写一个可以在`before:each`块中调用的辅助方法. (3认同)