【问题标题】:Using Cookies with Rack::Test在 Rack::Test 中使用 Cookie
【发布时间】:2011-07-17 03:37:21
【问题描述】:

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

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

【问题讨论】:

    标签: ruby cookies rspec sinatra rack


    【解决方案1】:

    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。

    【讨论】:

    • 好的,现在我看到 cookie 设置正确,但是当我请求路由需要有效 cookie 时,我得到了错误。 (如果 cookie 未设置或不正确,服务器返回 401 错误)
    • UPD。 rack_mock_session.cookie_jar["foo"] 不仅在一篇文章中为空,在下一次测试中它为空。
    • UPD。通过将 cookie 存储在全局变量中来解决,所以在每次请求之前我都设置了 cookie。
    • 我更新了答案,为您的问题提供了可能的解决方案。
    • 让 cookie jar 在测试中持续存在可能不是一个好主意,因为这样您的测试取决于它们的运行顺序(并且当它们中断时您不能运行单个测试) .如果您需要在许多测试中执行相同的 arrange 步骤(在您 act 和 assert 之前),那么您最好编写帮助方法您可以拨打before :each 块。
    猜你喜欢
    • 2017-09-02
    • 2011-01-27
    • 2012-11-14
    • 2011-12-03
    • 1970-01-01
    • 2011-07-17
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多