4

インデックス アクションを使用して HomeController をセットアップしたとします。

class HomeController < ApplicationController
  def index
    @users = User.all
  end
end

ルートパス経由でルーティングされ、

  root :to => "home#index"

この要求仕様が失敗する理由

it 'should called the home#index action' do
    HomeController.should_receive(:index)
    visit root_path
end

次のメッセージで

 Failure/Error: HomeController.should_receive(:index)
   (<HomeController (class)>).index(any args)
       expected: 1 time
       received: 0 times

? インデックスメソッドがクラスメソッドではなくインスタンスメソッドで呼ばれているからでしょうか。

4

2 に答える 2

23

何をテストしたいのか正確にはわかりません。また、どこでどのメソッドを使用できるかについて混乱があると思いますので、Routing specsRequest SpecsController specs、およびFeature specsの例を挙げてみます。うまくいけば、そのうちの1つがあなたに適しています。

ルーティング

ルート パスが確実にhome#indexアクションにルーティングされるようにする場合は、ルーティング仕様が適切な場合があります。

仕様/ルーティング/ルーティング_spec.rb

describe "Routing" do
  it "routes / to home#index" do
    expect(get("/")).to route_to("home#index")
  end
end

リクエスト

indexルート パスへのリクエストでテンプレートが確実にレンダリングされるようにしたい場合は、リクエスト仕様が適切な場合があります。

仕様/要求/home_requests_spec.rb

describe "Home requests" do
  it 'successfully renders the index template on GET /' do
    get "/"
    expect(response).to be_successful
    expect(response).to render_template(:index)
  end
end

コントローラ

のアクションindexへのリクエストでテンプレートが確実にレンダリングされるようにしたい場合は、コントローラ仕様が適切かもしれません (この場合はリクエスト仕様に非常に似ていますが、コントローラのみに焦点を当てています)。indexHomeController

仕様/コントローラー/home_controller_spec.rb

describe HomeController do
  describe "GET index" do
    it "successfully renders the index template" do
      expect(controller).to receive(:index) # this line probably of dubious value
      get :index
      expect(response).to be_successful
      expect(response).to render_template(:index)
    end
  end
end

特徴

によってレンダリングされるページに特定のコンテンツがあることを確認したい場合は、機能仕様が適切な場合があります (また、 Rails/RSpec のバージョンによっては、などのCapybara メソッドhome#indexを使用できる唯一の場所でもあります):visit

仕様/機能/home_features_spec.rb

feature "Index page" do
  scenario "viewing the index page" do
    visit root_path
    expect(page).to have_text("Welcome to my awesome index page!")
  end
end
于 2013-06-09T14:53:40.623 に答える