سؤال

بعد استنساخ أحدث الإصدارات المستقرة من

في تطبيق Clean Rails، واتباع (ما أعتقده) جميع التعليمات الخاصة بكل مكون إضافي، لا تزال قصص الخيار تفشل :-(.وفيما يلي ملخص للمشاكل:

  1. لا تعمل عمليات إعادة التوجيه فورًا على الرغم من إنشاء المسار "map.root :controller => "my_controller"":
    expected redirect to "/", got no redirect (Spec::Expectations::ExpectationNotMetError)
    /cygdrive/c/development/test/vendor/plugins/rspec/lib/spec/expectations.rb:57:in `fail_with'
    /cygdrive/c/development/test/vendor/plugins/rspec/lib/spec/expectations/handler.rb:14:in `handle_matcher'
    /cygdrive/c/development/test/vendor/plugins/rspec/lib/spec/expectations/extensions/object.rb:31:in `should'.
    /features/step_definitions/user_steps.rb:111:in `/^an? (.*) user named '(.*)'$/'
    features/sessions.feature:25:in `And an activated user named 'reggie''
    
  2. القصة تقول logged_in? الطريقة محمية على الرغم من features/step_definitions/ra_env.rb استدعاء الملف:
    ApplicationController.send(:public, :logged\_in?, :current\_user, :authorized?)
    ألا يجعل هذا الاستدعاء تلك الأساليب متاحة دون الحاجة إلى التشويش؟

أوه، وأنا أحاول تشغيل Autospec، لذا قمت بتنفيذ الأوامر التالية لبدء تشغيله:

export AUTOFEATURE=true
rake spec:server:start
ruby script/autospec
هل كانت مفيدة؟

المحلول

لقد قمت ببعض الأبحاث وهذا ما حصلت عليه.ال ra_response_steps.rb توقع أن تأتي عملية إعادة التوجيه بشكل خام ومن ثم تحدد القصة ما إذا كان يجب اتباع عملية إعادة التوجيه أم لا.فشل هذا لأن تنفيذ جلسة Webrat يحتوي على الكود التالي:

    def request_page(url, http_method, data) #:nodoc:
      h = headers
      h['HTTP_REFERER'] = @current_url if @current_url

      debug_log "REQUESTING PAGE: #{http_method.to_s.upcase} #{url} with #{data.inspect} and HTTP headers #{h.inspect}"
      if h.empty?
        send "#{http_method}", url, data || {}
      else
        send "#{http_method}", url, data || {}, h
      end

      save_and_open_page if exception_caught? && Webrat.configuration.open_error_files?
      raise PageLoadError.new("Page load was not successful (Code: #{response_code.inspect}):\n#{formatted_error}") unless success_code?

      reset

      @current_url  = url
      @http_method  = http_method
      @data         = data

      if internal_redirect?
        check_for_infinite_redirects
        request_page(response_location, :get, {})
      end

      return response
    end

لاحظ ال if internal_redirect? ... end.وهذا هو السبب الذي يجعل اختباراتنا تفشل لأن webrat يتبع عمليات إعادة التوجيه.كحل بديل، يمكنك التعليق على هذه السطور في جلسة webrat الخاصة بك ولكن ربما لا يكون هذا حلاً مناسبًا.سأعمل أكثر قليلاً وأقوم بنشر التصحيح في مكان ما.

نصائح أخرى

لقد وجدت مشاركة المدونة هذه التي تشرح جوهر المشكلة جيدًا:

http://blog.andrew.premdas.org/articles/2008/10/15/webrat-visits-and-redirects

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

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

Then she should be at the new session page                     # features/step_definitions/ra_response_steps.rb:15
  expected "session/new", got redirected to "http://www.example.com/session/new" (Spec::Expectations::ExpectationNotMetError)

لا أفهم من أين يأتي موقع example.com هذا.أي شخص آخر لديه خطأ مماثل؟

اضطررت إلى تغيير تعريف وظيفة تسجيل الخروج في user_steps.rb إلى:

قم بإلغاء تسجيل الخروج
الحصول على "/ تسجيل الخروج"
نهاية

في السابق كانت تحاول الحصول على "/session/destroy" والذي لا يوجد إلا إذا لم تقم بإزالة المسارات الافتراضية.

تأكد أيضًا من "تضمين AuthenticatedSystem" في application_controller.

لا يزال القتال من خلال بعض القضايا الأخرى على الرغم من ...

أما بالنسبة لمشكلة "الطريقة المحمية"، فقد اكتشفت أنه إذا لم أستخدم المواصفات التلقائية وتركت config.cache_classes=true، فستنجح الاختبارات.

يؤدي تشغيل config.cache_classes=false إلى ظهور الخطأ مرة أخرى.

يبدو أن المشكلة تكمن إما في كيفية تنفيذ التخزين المؤقت للفصل في Rails، أو في كيفية إدارة rspec للفئات التي تم إنشاؤها.لسوء الحظ، ليس لدي الموارد اللازمة للتحقيق في هذا السجل بالكامل، ويبدو أن هناك مناقشة جيدة حول هذا الموضوع تجري على:http://groups.google.com/group/rspec/browse_thread/thread/500ede090bd08996/25a3d9a7d283696b?lnk=gst&q=cache_classes#25a3d9a7d283696b

ليس لدي الكثير من الإرشادات لأقدمها، فقط التعاطف - لقد أمضيت بضع ساعات مؤخرًا في التعامل مع نفس المشكلة.على الجانب العلوي، هذه هي الطريقة التي تعلمت بها RSpec.

شيء واحد وجدته هو أن الكثير من حالات الفشل كانت أشياء أردت تغييرها على أي حال - على سبيل المثال، لم أرغب في إعادة التوجيه إلى "/" عند تسجيل الدخول، ولكن في مكان آخر.

في النهاية، كان من السهل إصلاح معظم حالات الفشل، بمجرد أن أعرف أين أبحث.

أنا أعمل من خلال نفس القضايا.لم أصل إلى هذه النقطة بعد، ولكن أعتقد أن ApplicationController.send(:public, :logged_in?, :current_user, :authorized?) يحتاج إلى الانتقال إلى support/env.rb بدلاً من ذلك.

أحصل على بعض الأخطاء المذكورة أيضًا.لكن المشكلة الأولى التي تحدث في تطبيقي هي:

تعريفات الخطوات المتعددة لها نفس التعبير العادي:

Features/step_definitions/user_steps.rb:16:in /^(.*) (.*) user named '(.*)'$/' features/step_definitions/user_steps.rb:29:in/^ لا يوجد مستخدم (.*) اسمه '(.*).*)'$/'

(الخيار::زائدة عن الحاجة)

بالتأكيد، يمكنني إصلاح هذا، ولكن ستتبع ذلك العديد من الأخطاء (بما في ذلك تسجيل الدخول المحمي؟على وحدة التحكم، ومواصفات RSpecs الفاشلة، وما إلى ذلك).

هل يعرف أحد ما إذا كنا جميعًا نفعل شيئًا خاطئًا بشكل أساسي هنا؟أم أن الأمر مجرد أن Restful_authentication معطل في إصداره الحالي؟

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