Rspec / Capybara: тестирование, если вызывается метод контроллера

Учитывая, что я настроил 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)
   ().index(any args)
       expected: 1 time
       received: 0 times

? Это потому, что метод индекса вызывается как метод экземпляра, а не метод класса?

 Paul Fioravanti09 июн. 2013 г., 01:44
Предполагая, что спецификация находится под вашимспецификации / контроллеры каталог, попробуйте просто изменить строку наcontroller.should_receive(:index) и посмотреть, если это работает.
 user219133209 июн. 2013 г., 05:30
Спецификация находится в спецификации / запросе, и я предпочитаю, чтобы это была спецификация запроса. И нет, он не работает в spec / controllers / home_controller_spec.rb даже после изменения: controller.should_receive (: index) (# <HomeController: 0x00000004989e10>) .index (любые аргументы) ожидается: 1 раз получил: 0 разI '

Ответы на вопрос(2)

class MyController < ApplicationController
  def index
    my_method
  end

  def my_method
  end
end

describe MyController do
  it 'calls my method' do
    expect(controller).to receive(:my_method)

    get :index
  end
end
Решение Вопроса

что именно вы хотите проверить, и я думаю, чтонекоторая путаница относительно того, какие методы могут быть использованы, где, поэтому япопробую и приведу примерыСпецификации маршрутизации,Запросить спецификации,Спецификации контроллера, а такжеХарактеристикии, надеюсь, один из них подойдет вам.

маршрутизация

Если вы хотите убедиться, что ваш корневой путь направляется кhome#index действие, спецификация маршрутизации может быть подходящей:

спецификации / маршрутизации / routing_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 шаблон отображается по запросуindex действие вашегоHomeController, спецификация контроллера может быть подходящей (и весьма похожей на спецификацию запроса в этом случае, но сфокусированной исключительно на контроллере):

спецификации / контроллеры / 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
Особенность

Если вы хотите убедиться, что страница отображаетсяhome#index имеет определенный контент, спецификация функции может быть уместна (а также единственное место, которое вы можете использоватьМетоды капибары лайкvisitв зависимости от вашей версии Rails / RSpec):

спецификации / особенности / 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
 Steven Aguilar19 апр. 2018 г., 03:55
Будет ли иметь дело с сессиями при тестировании контроллера, я получаю следующееexpecting but was a redirect to
 Andreas Lyngstad10 июн. 2013 г., 23:48
@ user2191332 Ты должен принять Пола Фиоравантис ответом, это отличный
 Paul Fioravanti10 июн. 2013 г., 01:26
Там's много похожих вопросов о написании спецификаций для Omniauthна StackOverflow и направляет вRailscasts среди других. Посмотрите эти ресурсы и посмотрите, что подходит именно вам.
 user219133209 июн. 2013 г., 19:11
Понимаю. Таким образом, #should_receive работает с #get, но не с #visit, и должен использовать экземпляр контроллера в HomeController. На самом деле я хочу протестировать вход через omniauth, поэтому мне нужны интеграционные тесты. Единственное, что меня волнует, это то, что Sessions # create вызывается, а не туда, куда он направляется, так как я перенаправлю пользователя туда, откуда он пришел. Кажется, что лучше всего просто протестировать поведение в методе Sessions # create. Это самый подходящий?

Ваш ответ на вопрос