#ruby-on-rails #ruby #rspec #rspec-rails #shoulda
#ruby-on-rails #ruby #rspec #rspec-rails #должен
Вопрос:
Согласно странице shoulda,
Сопоставители ActionController
— маршрут проверяет ваши маршруты.
И я просто не уверен, для чего он используется. Особенно в спецификации изолированного модуля контроллера. Почему это указано в спецификации контроллера? В чем актуальность? Разве это не должно быть просто в его собственной спецификации маршрутов? И все же на странице shoulda этот сопоставитель указан как сопоставитель ActionController…
Или ActionController, отвечающий за маршруты, использует этот сопоставитель?
Если я должен использовать этот сопоставитель в своих спецификациях контроллера, могу ли я привести пример, чтобы показать, как я должен это использовать?
Комментарии:
1. вы меняете тему спецификации — большинство сопоставителей контроллеров shoulda-matchers будут ужасно ломаться, если вы это сделаете. github.com/thoughtbot/shoulda-matchers/issues/90
2. Какой должна быть тема. Контроллер? И не могли бы вы немного объяснить, что он на самом деле делает?
3. тема должна быть оставлена по умолчанию, которая для спецификации контроллера является самим контроллером.
4. Я получаю
Failure/Error: controller.should route(:get, '/posts/1').to(action: :show, id: 1) NoMethodError: undefined method 'should' for #<FoldersController:0x007fbed9516630>
5. оставим эту тему полностью.
it { should route(whatever).to(whatever) }
Ответ №1:
Почему route
совпадение shoulda-matchers является ActionController
совпадением?
route
сопоставитель shoulda-matchers является ActionController
сопоставителем просто потому, что его объектом может быть контроллер. Вы можете указать :controller
сами, в этом случае тема не имеет значения:
describe 'Routing' do
it { is_expected.to route(:get, '/posts/1').to(controller: :posts, action: :show, id: 1) }
end
или вы можете позволить ему сделать вывод :controller
за вас:
describe PostsController do
it { is_expected.to route(:get, '/posts/1').to(action: :show, id: 1) }
end
В последнем случае все, что route
делает с объектом ( PostsController
), — это вызывает .controller_name
его. Но он использует контроллер, так что это ActionController
сопоставитель.
route
Для спецификаций контроллера или спецификаций маршрутизации?
Маршрутизация — это полностью отдельный уровень Rails от контроллеров, поэтому RSpec имеет отдельные спецификации контроллера и маршрутизации, и именно так я их пишу. Но я использую shoulda-matchers, и мне нравится не вводить controller:
, поэтому я делаю объекты моих спецификаций маршрутизации контроллерами, как во втором примере выше.
Если вы пишете свои спецификации маршрутизации таким образом, тематика вашего контроллера и спецификации маршрутизации совпадают, поэтому вам может оказаться удобным поместить ваши примеры маршрутизации в файлы спецификаций вашего контроллера. Это упростило бы синхронизацию вашего контроллера и спецификаций маршрутизации при добавлении или удалении действий контроллера. Я бы не стал спорить с этим. Однако я хотел бы иметь в виду, что контроллер на самом деле не является предметом спецификаций маршрутизации; это просто экономит ваш ввод.
Rdoc shoulda-matchers предлагает обе возможности.
Комментарии:
1. Спасибо, Дэйв, прояснил это. Я думаю, что собираюсь поместить эти ожидания в свой
spec/routing/*
каталог. Это то, что вы делаете, верно?2. Да, это то, что я делаю.