8

単体テストで Etags に大きく依存しているコントローラーをカバーすることは可能ですか?

これが私がやろうとしていることです:ページが古くない場合(つまり、新しいことを意味します)、応答にヘッダーを追加しています。

すべて (rspec) をテストしようとすると、同様のリクエストがいくつあっても、304 ではなく 200 OK を受け取り、ヘッダーが変更されません。さらに、request.fresh?(response) を追跡すると、常に false になります。

ただし、ブラウザでは完全に機能します。私はすでに ActionController::Base.perform_caching = true を述べようとしましたが、全体的な状況は変わりません。

ありがとうございました

4

6 に答える 6

11

2 番目のリクエストが 304 レスポンスを返すかどうかをテストする方法は次のとおりです。

    get action, params
    assert_response 200, @response.body
    etag = @response.headers["ETag"]
    @request.env["HTTP_IF_NONE_MATCH"] = etag
    get action, params
    assert_response 304, @response.body
于 2013-03-11T21:09:13.707 に答える
5

Railsはあなたが提供する:etagをハッシュします:

headers['ETag'] = %("#{Digest::MD5.hexdigest(ActiveSupport::Cache.expand_cache_key(etag))}")

簡単な設定

frash_when(:etag => 'foo')

正しいダイジェストによってのみトリガーされます(二重引用符が必要です)

def with_etag
  if stale?(:etag => 'foo')
    render :text => 'OK'
  end
end

... tested by ...

@request.env['HTTP_IF_NONE_MATCH'] = '"acbd18db4cc2f85cedef654fccc4a4d8"'
get :with_etag
assert_equal 304, @response.status.to_i

変更についても同じ:

def with_modified
  if stale?(:last_modified => 1.minute.ago)
    render :text => 'OK'
  end
end

... tested by ...

@request.env['HTTP_IF_MODIFIED_SINCE'] = 2.minutes.ago.rfc2822
get :with_modified
assert_equal 304, @response.status.to_i
于 2011-09-08T05:37:18.973 に答える
4

わかりました、ここにポイントがあります:

リクエストを実行する前に、Rails コードの ETag に関連するすべての情報を読み、次の設定を忘れないでください。

request.env["HTTP_IF_MODIFIED_SINCE"]
request.env["HTTP_IF_NONE_MATCH"]

これらは ETag テストに必要なためです。

于 2010-04-15T10:54:54.610 に答える
0

Rails 4.2 では、テンプレートのダイジェストも考慮されるようになりました。私にとっては、以下が機能しました:

def calculate_etag(record, template)
  Digest::MD5.hexdigest(ActiveSupport::Cache.expand_cache_key([
    record,
    controller.send(:lookup_and_digest_template, template)
  ])).inspect
end

def set_cache_headers(modified_since: nil, record: nil, template: nil)
  request.if_modified_since = modified_since.rfc2822
  request.if_none_match = calculate_etag(record, template)
end

set_cache_headers(
  modified_since: 2.days.ago,
  record: @book,
  template: 'books/index'
)
于 2015-02-19T20:08:14.773 に答える