Для чего нужен сопоставитель маршрутов Shoulda?

#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. Да, это то, что я делаю.