0

非標準の一連のルートを介して到達するコントローラーのいくつかの基本的な側面をテストしようとしています。の適切なコントローラー/アクションに接続できないようですLessonsController。これは、につながるように見えるリダイレクトされたルートを介して到達しCoursesControllerます。

仕様を実行すると、ルーティング エラーが発生するか、応答が空になり、有用なナゲットを解析する方法がわかりません。

# app/controllers/lessons_controller.rb
def index
  ... set some instance vars ...
end

# The CoursesController has index and show methods of its own which aren't used here

# app/config/routes.rb
...
get 'courses/:course_name' => redirect('/courses/%{course_name}/lessons'), :as => "course"
get 'courses/:course_name/lessons' => 'lessons#index', :as => "lessons"
...

# spec/controllers/courses_controller_spec.rb
describe CoursesController do
  it "test some instance vars" do
    get :show, :course_name => Course.first.title_url
    assigns(:some_ivar).should_not be_empty
  end
end

エラー:

AbstractController::ActionNotFound: The action 'course' could not be found for CoursesController

RSpec 試行 #2:

# spec/controllers/courses_controller_spec.rb
...
  get :course, :course_name => Course.first.title_url
...

試み #2 エラー:

NoMethodError: undefined method `empty?' for nil:NilClass

lessons_controller_spec.rb代わりにファイルから開始することで同様の試行錯誤アプローチを実行すると(たとえばget :index、そこで試行するなど)、同様のエラーが発生します。には直接ルートは設定されてlessons#indexおらず、リダイレクトのみが設定されています。

2 番目の例の応答オブジェクトは巨大なので (本体は空ですが)、誰かが有用だと思わない限り含めません。

私は間違いなく非RESTfulアーキテクチャを後悔していますが、それが何であるかを考えると、コントローラの仕様を取得して内部の適切なアクションをターゲットにする方法はありますLessonsControllerか?

レール 3.2.12、RSpec 2.14.4、カピバラ 2.0.2

4

1 に答える 1

3

簡単な答え: いいえ。

実際にはget、テストで使用できる には 2 つのタイプがあります。

1 つはコントローラーのテスト用です。これは、get「アクション」などの引数のみを受け入れることができます。したがって、現在のコントローラーテスト内でのみ使用できます。(ドキュメントはこちら: http://api.rubyonrails.org/classes/ActionController/TestCase/Behavior.html#method-i-get ):index:show

もう 1 つのタイプは、統合テスト用です。これgetは、任意のパスを引数として受け入れることができます。http://api.rubyonrails.org/classes/ActionDispatch/Integration/RequestHelpers.html#method-i-get

2 つのタイプは同じ名前getですが、使用方法が異なります。

あなたの質問は、コントローラーのテストです。したがって、最初のものを使用しています。CoursesController 内のアクションにのみアクセスできます。そのため、エラーに遭遇します。

今すぐルートを修正することを強くお勧めします。RESTful かどうかの問題ではありませんが、あなたのルートは一日中変換を中断します。パスはレッスンですが、コントローラーはコースです。そして、彼のためのルートがないのに、なぜコースコントローラーを書くのでしょうか?

于 2013-11-08T07:30:01.407 に答える