اختبارات القضبان الوظيفية ، خطأ التوجيه
-
23-09-2019 - |
سؤال
أنا جديد في الاختبار ، وأواجه بعض الصعوبات في محاولة لإجراء اختبار وظيفي.
لدي رسائل _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 أكثر صرامة