0

ブラウザー経由でコントローラー ルートを正常にロードできるにもかかわらず、コントローラー ルートのテストでエラーが発生します。Rails4 + rspec.

何か案は?

#controller spec 
describe PublicSitesController do

  describe "GET index" do
    it "returns success" do
      get :index                        #line 7 in the spec file
      response.status.should == 200
    end
  end

end


#routes
get ":site_name/:page_name", to: "public_sites#show"
get ":site_name", to: 'public_sites#index'
get "/", to: 'public_sites#root'


#controller
class PublicSitesController < ApplicationController

  def root
  end

  def index
  end

  def show
  end

end

#the error:
Failures:

1) PublicSitesController GET index returns success
   Failure/Error: get :index
   ActionController::UrlGenerationError:
     No route matches {:action=>"index", :controller=>"public_sites"}
   # ./spec/controllers/public_sites_controller_spec.rb:7:in `block (3 levels) in <top (required)>'

以下は、rake ルート経由の関連ルートです。

      GET    /:site_name/:page_name(.:format)                  public_sites#show
      POST   /:site_name/:page_name(.:format)                  public_sites#receive_form
      GET    /:site_name(.:format)                             public_sites#index
      GET    /                                                 public_sites#root
4

1 に答える 1

1

リクエストにいくつかのパラメーターがありません。ルーターは ":site_name" をどう処理すればよいかわかりません。次のようにしてみてください:

get :index, site_name: 'something'

編集:

テスト内で get/post/etc を呼び出すときは、URL ではなくそのメソッドでアクション名を呼び出します。これにより、コントローラーのテストは、そのアクションを機能させる URL に依存しなくなります (URL を変更しても、コントローラーは引き続き動作します)。仕事)

ルートは、「site_name」という名前のパラメーターが必要であることをレールに伝えるため、アクションのパラメーターを使用して「site_name」の内容をレールに伝える必要があります

必要に応じて、ルーティング テストを行うことができます。そこで、いくつかの URL がいくつかのパラメーターに何らかの値を持つコントローラーのアクションに移動することをテストできますhttps://www.relishapp.com/rspec/rspec-rails/v/2-3/docs /ルーティング仕様

アクションを呼び出していないブラウザーでサイトを開くと、実際にはアプリケーション全体が実行され、ルーティング システムがコントローラーのアクションを呼び出します。

編集2:showアクションをテストしたい場合は、それを呼び出す必要があります

get :show, site_name: 'some_site', page_name: 'some_page'
于 2013-11-01T12:24:12.703 に答える