Я думаю, вам может понадобиться изменить строку на метод.
До
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"
какстрока - и представление нигде не содержит этого.
Вы искали имя метода как строку, а не строку, которую возвращает метод.
Еще вопросы, просто задавайте!