Проверьте, какое представление отображается

#ruby-on-rails #rspec

#ruby-on-rails #rspec

Вопрос:

В соответствии с кодом, следующим за кодом (взятым отсюда):

 describe WidgetsController do
  describe "index" do
    it "renders the index template" do
      get :index
      expect(response).to render_template("index")
      expect(response.body).to eq ""
    end
    it "renders the widgets/index template" do
      get :index
      expect(response).to render_template("widgets/index")
      expect(response.body).to eq ""
    end
  end
end
  

Похоже, мы можем проверить, что определенное представление отображается, фактически не отображая само представление, что является хорошей спецификацией модуля.

Однако у меня это не работает:

 subject { response }

describe '#create' do
  context 'with valid params' do
    before do
      post :create, asset: { uploaded_file: file }
    end

    it { should have_http_status 302 }
    it { should redirect_to '/' }
    it { should render_template 'home' }

  end
end
  

результаты:

 AssetsController
  #create
    with valid params
      should respond with numeric status code 302
      should redirect to "/"
      should render template matcher "home" (FAILED - 1)

Failures:

  1) AssetsController#create with valid params should render template matcher "home"
     Failure/Error: it { should render_template 'home' }
       expecting <"home"> but rendering with <[]>
     # ./spec/controllers/assets_controller.rb:27:in `block (4 levels) in <top (required)>'
  

Итак, как мне приступить к тестированию представлений без их рендеринга?

Ответ №1:

Ваш код выполняет перенаправление, а не рендеринг (о чем свидетельствует второй it блок)

В браузере это перенаправление вполне может привести к созданию домашнего шаблона, но спецификации контроллера обрабатывают один HTTP-запрос / ответ одновременно (как вы указали, мы пытаемся модульное тестирование контроллера)

Если вы хотите указать, что происходит после того, как браузер следует за перенаправлением, тогда вам нужна спецификация запроса.

Комментарии:

1. Хорошо, теперь я понимаю. Тестирование того, какое представление в конечном итоге отключается от пользователя после перенаправления, приведет к извлечению файла маршрутов и другого действия в спецификацию устройства 🙂

2. Вы бы сказали, что спецификация контроллера проверяет только код состояния, куда он перенаправляет / отображает и какие переменные экземпляра установлены?

3. Да, в значительной степени. При желании вы можете заставить его выполнять рендеринг, но это встречается реже