سؤال

أنا جديد في الاختبار ، وأواجه بعض الصعوبات في محاولة لإجراء اختبار وظيفي.

لدي رسائل _controller ، و user_controller هنا. في الطرق ، حددت أن موارد المستخدمين HAS_MANY.

الآن أحاول إجراء اختبار بسيط في وحدة تحكم الرسائل:

def test_index
  get :index, { :user_id => 1 }
  assert_template 'index'
end

لكن احصل على خطأ في التوجيه من القضبان ، أنه لا يمكنه العثور على طريق إلى الرسائل. لا أريد تضمين طريق إلى الرسائل فقط بسبب الاختبارات. كيف يمكنني إخبار الاختبار بأنه يجب أن يصل من عنوان URL /المستخدمين /الرسائل؟

الطرق الكاملة. rb:

ActionController::Routing::Routes.draw do |map|

  map.login  'login',   :controller => :user_sessions, :action => :new
  map.logout 'logout',  :controller => :user_sessions, :action => :destroy
  map.signin 'signin',  :controller => :users,         :action => :new

  map.connect 'search/:action/:word', :controller => :search
  map.connect 'search/:word',         :controller => :search, :action => :index

  map.resources :forums do |forums| 
    forums.resources :forum_posts, :collection => {:preview => :post }, :as => :posts do |post|
      post.resources :forum_posts, :as => :reply
      post.resources :reports
    end
  end

  map.resources :newsitems, :as => :news do |news|
    news.resources :comments do |comment|
      comment.resources :reports
    end
  end

  map.resource :user_sessions
  map.resources :users, 
                :as => :profiles,
                :controller => :profiles,
                :has_many   => [ :messages ]
  map.resource :profiles
  map.resource :me,            
               :controller => :me,
               :has_many   => [ :messages ]


  map.resources :comments, :has_many => [ :reports ]
  map.resources :forum_posts, :has_many => [ :reports ]
  map.resources :reports

  map.home  '/', :controller => :home
  map.root  :controller => :home

  map.namespace :admin do |admin|
    admin.namespace :forum do |forum|
      forum.resources :categories
      forum.resources :posts
      forum.resources :forums
      forum.root      :controller => :home
    end
    admin.resources :notices
    admin.resources :users
    admin.workflow  'workflow/:action', :controller => :workflow
    admin.resources :newsitems
    admin.resources :reports
    admin.resources :comments    
    admin.root :controller => :home
  end

  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'
end

تحديث

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

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

المحلول

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

class MessagesController < ApplicationController
  def index
    @messages = User.find(params[:user_id]).messages
  end
end

إذا كان لديك يفعل نفس الشيء بشكل أساسي ، فقد يكون سبب مشكلة التوجيه بسبب تعارض في ملف التوجيه الخاص بك ، وهو ما أظن أنه قد يكون عليه الحال. هل يمكنك نشره؟ لمعلوماتك ، كتبت مقال عن اختبار طرقك, ، وستكون هذه فكرة جيدة جدًا لأنها ستحصل على أخطاء التوجيه في وقت مبكر ، قبل أن تتدخل مع وحدات التحكم.

على أي حال ، إذا كان بإمكانك نشر طرقك ، فيمكنني إلقاء نظرة.

تحديث: بعد النظر إلى طرقك ، هناك صراعات زوجين. يمكنك الحصول على رسائل كمصدر فرعي لأكثر من مورد آخر ، ولكن في وحدة التحكم في الرسائل الخاصة بك ، سيتعين عليك حساب إمكانية إمكانية إمكانية وجود params [: me_id] أو params [: profile_id]. يبدو أنهما على حد سواء نموذج المستخدم تحته ، لذلك يمكن أن يكون بسيطًا مثل:

@user = User.find(params[:me_id] || params[:profile_id])

وربما ترغب في تجريد ذلك في طريقة تتصل بها before_filter.

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

<%= link_to message.name, profile_message_path(@profile, @message) %>

ومع ذلك ، إذا كنت تستخدم مسارات غير متداخلة مثل message_path(@message), ، سوف يفشل لأنه لا توجد طرق رسائل غير متداولة.

نصائح أخرى

لقد كانت مشكلة في جوهرة "رحلتي". لقد جعلوا الطرق أكثر صرامة في رحلة 1.0.4 والتي تظهر فقط على بيئة "اختبار". إنه جيد لـ "التطوير" و "الإنتاج".

** تأكد من أنك تستخدم بالضبط نفس المعلمات المعلنة في الطرق **

إما إضافة:

get :index, :locale => "en"

أو في تحديث Gemfile الخاص بك:

gem 'journey', '1.0.3'

الحل الثاني هو الحل للوقت. من الناحية المثالية ، يجب أن تختبر مساراتك كل المعاملات الدقيقة. الرحلة 1.0.4 أكثر صرامة

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