Спецификация запроса Rspec проверяет тело ответа - PullRequest
0 голосов
/ 04 декабря 2018

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

On relishapp я нашел эту часть:

expect(response.body).to include("Widget was successfully created.")

, что побудило меня включить следующее в мой тест запроса:

describe "Index page" do
  ....
  it 'includes a link to cars_parts' do
    get "/car_overview"      
    expect(response.body).to include("car_parts_path")
  end
  ....
end 

Этот тест не пройден.В представлении я использую link_to на car_parts url_helper.Неудачный тест сбрасывает всю строку response.body String, и я вижу car_parts_path, но rspec не видит его.Как мне изменить свой тест, чтобы он прошел без использования капибары, так как теперь его можно использовать только с техническими характеристиками.И все ли я делаю правильно, или этот тест должен пойти куда-нибудь еще?

1 Ответ

0 голосов
/ 04 декабря 2018

Я думаю, вам может понадобиться изменить строку на метод.

До

expect(response.body).to include("car_parts_path")

После

expect(response.body).to include(car_parts_path) # Remove the quotes

Объяснение

car_parts_path - это метод в Rails, который оценивает фактический путь.Если вы используете этот URL-помощник в своем представлении, это должно работать.

Но я думал, что тело ответа было строкой?

Да, так и есть.Когда вы вызываете car_parts_path, вы вызываете метод Ruby в среде Rails.

car_parts_path будет возвращать строку.Эта строка будет "/car_parts".

В принципе, каждый раз, когда вы видите car_parts_path, представьте, что это "/car_parts" в виде строки.Потому что эти два в точности эквивалентны.

В тесте

Так что, когда у вас есть это в тесте:

expect(response.body).to include(car_parts_path) # car_parts_path is a method that returns "/car_parts" so it's the same as...

Это оцениваеттакой же как:

expect(response.body).to include("/car_parts")

В представлении

В представлении ERB вы получите:

<%= link_to "Car Parts", car_parts_path %>

Это оценивается как:

<%= link_to "Car Parts", "/car_parts" %>

Это отображает тег a в вашем html:

<a href="/car_parts">Car Parts</a>

Заключение

Вы проверяете "/car_parts" в теле ответа иview содержит эту строку, тест теперь проходит, и все готово!

Почему мой оригинальный код не работает?

Rails искал "car_parts_path" какстрока - и представление нигде не содержит этого.

Вы искали имя метода как строку, а не строку, которую возвращает метод.

Еще вопросы, просто задавайте!

...