اختبار تحكم المتغيرات سبيل المثال مع رف::اختبار سيناترا

StackOverflow https://stackoverflow.com/questions/1928968

  •  20-09-2019
  •  | 
  •  

سؤال

لدي سيناترا التطبيق الذي يخدم صفحات للقراءة فقط أو للتحرير اعتمادا على ما إذا كان المستخدم بتسجيل الدخول.

تحكم مجموعات متغير @can_edit, أن يستخدم من قبل وجهات النظر إلى إخفاء/إظهار تحرير الروابط.كيف يمكنني اختبار @can_edit's القيمة في الاختبارات ؟ ليس لدي أي فكرة عن كيفية الحصول على هذه الحالة من تحكم تحت الرف::الاختبار.

يمكنني استخدام class_eval إلى كعب في logged_in? طريقة في وحدة تحكم ، ولكن أنا الحاجة إلى اللجوء إلى فحص last_response.body أجل تحرير الروابط لمعرفة ما إذا كان @can_edit تم تعيين أم لا.

كيف يمكنني اختبار قيمة @can_edit مباشرة ؟

هل كانت مفيدة؟

المحلول

للأسف أنا لا أعتقد أن هذا غير ممكن من دون تعديل الرف::الاختبار.عند تقديم طلب خلال تطبيق الاختبار ، رف::اختبار يفعل ما يلي:

  1. ويضيف الطلب إلى قائمة من الطلبات الأخيرة
  2. إنشاء مثيل جديد من التطبيق الخاص بك و تحتج به call طريقة
  3. يضيف التطبيق الخاص بك استجابة قائمة من الردود الأخيرة

فإنه من السهل للوصول إلى 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

وهذا يسمح لك لاختبار ضد سيناترا قبل المتغيرات تصفية وأو مثيل الوصول التي تم إنشاؤها لتطبيق القاعدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top