Sinatra,Rack :: Test和条件GET请求

时间:2011-10-11 15:30:12

标签: testing sinatra rack functional-testing

我有一个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?任何建议将不胜感激。

2 个答案:

答案 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