#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. Да, в значительной степени. При желании вы можете заставить его выполнять рендеринг, но это встречается реже