2

私はテストに不慣れで、機能テストを実行しようとしていくつかの問題があります。

ここにmessages_controllerとuser_controllerがあります。ルートでは、ユーザーリソースにhas_manyメッセージリソースがあることを定義しました。

今、私はメッセージコントローラーで簡単なテストを実行しようとしています:

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

しかし、レールからルーティングエラーが発生し、メッセージへのルートが見つかりません。テストのためだけにメッセージへのルートを含めたくありません。彼が/users/ messagesのURLからアクセスする必要があることをテストに伝えるにはどうすればよいですか?

完全なroutes.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

アップデート

すべての機能テストでルーティングエラーが発生することに気づきました。ニュースアイテムのような最も単純なものでさえ。理由はわかりません。

4

2 に答える 2

3

ルーティングコードを使用して空白の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

もう1つの問題は、プロファイルルートが2つ重複していることですが、その理由はわかりません。テストはとにかくルーティングエンジンをバイパスするので、テストでのルーティングエラーではないと思います。不適切な形式のURLを含むメッセージへのリンクが含まれている可能性があるため、インデックスビューのエラーだと思います。たとえば、メッセージへのリンクがあり、@ profileオブジェクトがある場合は、次のように呼び出す必要があります。

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

ただし、のようなネストされていないパスを使用している場合は、ネストさmessage_path(@message)れていないメッセージルートがないため、失敗します。

于 2010-01-28T14:06:13.787 に答える
0

それは私の「旅」の宝石の問題でした。彼らは、「テスト」環境でのみ表示されるジャーニー1.0.4でルートをより厳密にしました。「開発」や「生産」に適しています。

**ルートで宣言されているものとまったく同じパラメータを使用していることを確認してください**

次のいずれかを追加します。

get :index, :locale => "en"

またはGemfileアップデートで:

gem 'journey', '1.0.3'

2番目の解決策は、当面の回避策です。理想的には、ルートをすべて正確なパラメータでテストする必要があります。ジャーニー1.0.4はもっと厳しいです

于 2013-07-11T13:39:38.033 に答える