Sinatra, Rack :: Test и условные запросы GET - PullRequest
3 голосов
/ 11 октября 2011

У меня есть приложение Sinatra 1.2.0, которое выполняет Last-Modified кэширование проверки с помощью 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?Любой совет будет оценен.

Ответы [ 2 ]

1 голос
/ 18 октября 2011

У меня была похожая проблема с заголовком If-None-Match и ETag. Я не мог заставить это работать также с методом header Rack :: Test's. Но вот что сработало:

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!

0 голосов
/ 14 марта 2015

Я бы использовал заголовок, отправляемый из ответа, то есть тот фактический 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
...