Testing Sinatra、Rack::Test和条件GET请求

Testing Sinatra、Rack::Test和条件GET请求,testing,sinatra,rack,functional-testing,Testing,Sinatra,Rack,Functional Testing,我有一个Sinatra 1.2.0应用程序正在使用Rack::Cache执行上次修改的验证缓存。一切都很顺利——我在路由正文中调用last_modified,如果缓存有最新副本,其余执行将停止,我的应用程序将以304 Not modified响应缓存,缓存将为缓存页面提供服务,而不必生成新页面 我的问题是如何为这个过程编写测试。使用Rack::Test和Minitest::Spec,我模拟缓存的条件Get请求,如下所示: header "If-Modified-Since", (Time.n

我有一个Sinatra 1.2.0应用程序正在使用Rack::Cache执行上次修改的验证缓存。一切都很顺利——我在路由正文中调用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?任何建议都将不胜感激。

如果标题和ETag不匹配,我对
也有类似的问题。我也无法使用Rack::Test的
头方法来实现这一点。但真正起作用的是:

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如何实现
跟随重定向的启发

我将使用从响应中发送的头,这是实际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

这就成功了,服务器响应304 Not MODIFED。谢谢