كيفية اختبار القضبان التخزين المؤقت ETAG؟
-
27-09-2019 - |
سؤال
هل من الممكن تغطية وحدة التحكم الخاصة بي ، وهذا يعارض للغاية على etags مع اختبارات الوحدة؟
إليك ما أحاول القيام به: في حالة عدم وجود الصفحة (بمعنى أنها جديدة) ، أقوم بإضافة بعض الرأس إلى الرد.
عندما أحاول اختبار كل شيء (RSPEC) ، بغض النظر عن عدد الطلبات المماثلة التي لدي ، ما زلت أتلقى 200 موافق بدلاً من 304 ، ولا يتم تعديل رأسي. علاوة على ذلك ، إذا قمت بتتبع الطلب.
ومع ذلك ، فهو يعمل تماما في المتصفح. لقد حاولت بالفعل أن أقوم بإجراءات ActionController :: base.perform_caching = true ، لا يغير الموقف الكلي.
شكرًا لك
المحلول 3
حسنًا ، هذه نقطة:
قبل الوصول إلى الطلب ، اقرأ كل ما يتعلق بـ ETAGS في رمز القضبان ولا تنسى ضبطه:
request.env["HTTP_IF_MODIFIED_SINCE"]
request.env["HTTP_IF_NONE_MATCH"]
لأنها مطلوبة لاختبار ETAG.
نصائح أخرى
إليك كيفية اختبار ما إذا كان الطلب الثاني يعود 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
تجزئة القضبان: 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
هذا gist مفيد للغاية اختبار etag في RSPEC -
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'
)
على الأقل في Rails 5.2 ، فشل حل Szeryf. هذا الاختلاف يعمل:
get action, parms
assert_response 200, @response.code
etag = @response.headers["ETag"]
get action, parms, headers: { "HTTP_IF_NONE_MATCH": etag }
assert_response 304, @response.code
انظر أدلة القضبان: https://guides.rubyonrails.org/testing.html#setting-headers-and-cgi-variables