اختبار تحكم المتغيرات سبيل المثال مع رف::اختبار سيناترا
سؤال
لدي سيناترا التطبيق الذي يخدم صفحات للقراءة فقط أو للتحرير اعتمادا على ما إذا كان المستخدم بتسجيل الدخول.
تحكم مجموعات متغير @can_edit
, أن يستخدم من قبل وجهات النظر إلى إخفاء/إظهار تحرير الروابط.كيف يمكنني اختبار @can_edit
's القيمة في الاختبارات ؟ ليس لدي أي فكرة عن كيفية الحصول على هذه الحالة من تحكم تحت الرف::الاختبار.
يمكنني استخدام class_eval
إلى كعب في logged_in?
طريقة في وحدة تحكم ، ولكن أنا الحاجة إلى اللجوء إلى فحص last_response.body
أجل تحرير الروابط لمعرفة ما إذا كان @can_edit
تم تعيين أم لا.
كيف يمكنني اختبار قيمة @can_edit
مباشرة ؟
المحلول
للأسف أنا لا أعتقد أن هذا غير ممكن من دون تعديل الرف::الاختبار.عند تقديم طلب خلال تطبيق الاختبار ، رف::اختبار يفعل ما يلي:
- ويضيف الطلب إلى قائمة من الطلبات الأخيرة
- إنشاء مثيل جديد من التطبيق الخاص بك و تحتج به
call
طريقة - يضيف التطبيق الخاص بك استجابة قائمة من الردود الأخيرة
فإنه من السهل للوصول إلى last_request
و last_response
, ولكن للأسف لا يتم حفظ المعلومات عن حالة التطبيق الخاص بك في حين انها تعمل.
إذا كنت مهتما في القرصنة معا رف::اختبار التصحيح للقيام بذلك ، تبدأ من خلال النظر في rack-test/lib/rack/mock_session.rb
على خط 30.هذا هو المكان رف::تشغيل اختبار التطبيق الخاص بك يتلقى رف القياسية التطبيق عودة القيم (مركز, رؤوس, الجسم).تخميني هو أنك سوف تضطر إلى تعديل التطبيق الخاص بك وكذلك لجمع وإتاحة جميع المتغيرات سبيل المثال.
في أي حال, فمن الأفضل لاختبار النتائج ، وليس تفاصيل التنفيذ.إذا كنت ترغب في التأكد من تحرير الرابط غير مرئية ، اختبار وجود تحرير الرابط من قبل دوم id:
assert last_response.body.match(/<a href="..." id="...">/)
نصائح أخرى
ومن الممكن مع قليل من الإختراق. حالات سيناترا التطبيق غير متوفرة لأنها يتم إنشاؤها عندما يتم استدعاء سيناترا :: قاعدة # المكالمة. كما أوضح أليكس. هذا الإختراق يستعد مثيل قدما، والسماح للدعوة انتزاع المقبل عليه.
require 'something/to/be/required'
class Sinatra::Base
@@prepared = nil
def self.onion_core
onion = prototype
loop do
onion = onion.instance_variable_get('@app')
return onion if onion.class == self || onion.nil?
end
end
def self.prepare_instance
@@prepared = onion_core
end
# Override
def call(env)
d = @@prepared || dup
@@prepared = nil
d.call!(env)
end
end
describe 'An Sinatra app' do
include Rack::Test::Methods
def app
Sinatra::Application
end
it 'prepares an app instance on ahead' do
app_instance = app.prepare_instance
get '/foo'
app_instance.instance_variable_get('@can_edit').should be_true
end
end
وأنا أحسب من هذه التقنية ل همية المثيل الذي يدير اختبار الحالية في المقام الأول.
وهيريس سيئة ولكن قابلة للحياة بديل
# app.rb - sets an instance variable for all routes
before do
@foo = 'bar'
end
# spec.rb
it 'sets an instance variable via before filter' do
my_app = MySinatraApplication
expected_value = nil
# define a fake route
my_app.get '/before-filter-test' do
# as previously stated, Sinatra app instance isn't avaiable until #call is performed
expected_value = @foo
end
my_app.new.call({
'REQUEST_METHOD' => 'GET',
'PATH_INFO' => '/before-filter-test',
'rack.input' => StringIO.new
})
expect(expected_value).to eq('bar')
end
وهذا يسمح لك لاختبار ضد سيناترا قبل المتغيرات تصفية وأو مثيل الوصول التي تم إنشاؤها لتطبيق القاعدة.