我有一个Sinatra 1.2.0应用程序正在使用Rack :: Cache进行Last-Modified验证缓存。事情很好 - 我在路由体中调用last_modified,如果缓存有最新的副本,其余的执行暂停,我的应用程序响应缓存304 Not Modified,缓存服务于缓存页面无需生成新页面。
我的问题是尝试为此过程编写测试。使用Rack :: Test和Minitest :: Spec,我正在模拟缓存的条件Get请求,如下所示:
header "If-Modified-Since", (Time.now.midnight + 1.hour).httpdate
get "/test-url"
last_response.status.must_equal 304
但是,最后一行的断言失败了。该应用程序仍在发送200状态消息。我可以设置错误的请求吗? Rack :: Test是否正确执行条件GET?任何建议将不胜感激。
答案 0 :(得分:1)
我遇到了与If-None-Match
标头和ETag类似的问题。我无法使用Rack :: Test的header
方法。但是有用的是:
get '/test-url', {}, {"HTTP_IF_NONE_MATCH" => '"15-xyz"'}
last_response.status.should == 304
因此,在您的情况下,请尝试:
get '/test-url', {}, {"HTTP_IF_MODIFIED_SINCE" => (Time.now.midnight + 1.hour).httpdate}
last_response.status.must_equal 304
致谢:这受到了Rack :: Test如何实现follow_redirect!
答案 1 :(得分:0)
我会使用从响应发送的标头,即实际的HTTP客户端应该用来生成下一个请求的标头:
# first time responds with the content
get "/test-url"
last_response.status.must_equal 200
# but includes a header timestamp to be used by the client
last_modified = last_response.headers["Last-Modified"]
last_modified.wont_be_nil
# next time, it just responds with a 304 Not Modified status
get "/test-url", {}, {"HTTP_IF_MODIFIED_SINCE" => last_modified}
last_response.status.must_equal 304