2013-08-07 3 views
9

Мне любопытно, что люди считают адекватным/тщательным тестированием маршрутов. Парень, с которым я работаю, похоже, хочет утверждать каждый маршрут в нашем файле маршрутов, независимо от того, насколько стандартным. Я чувствую, что это пустая трата времени, но, возможно, я ошибаюсь, и я не знаю об этом, о чем я не знаю.Что тестировать в маршрутизации Rails?

Есть несколько случаев, когда я вижу некоторую ценность при маршрутизации. У нас все еще есть несколько действий, которые отвечают на запросы GET и POST, хотя я имею в виду избавиться от них. У нас нет каких-либо сумасшедших ограничений с лямбдами или чем-то еще, но похоже, что стоило бы проверить, если бы мы это сделали.

Но для определения нормальных ресурсов?

resources :foo, only: [:index, :show] 

У нас есть утверждения, что оба из этих маршрутов существует, мы утверждаем, что они GET и что они идут в правильном контроллер/действие. Есть ли какой-нибудь смысл в этом? Похоже, мы просто тестируем Rails на этом этапе.

По немного связанному вопросу, я предпочитаю иметь маршруты ресурсов, определенные как выше (с частью only: [:index, :show]). Имеются ли какие-либо последствия только для определения resources :foo в файле маршрутов, если на этом контроллере есть только действия index/show?

Мне кажется, что это, вероятно, просто больше времени и/или памяти, но как-то это также проблема безопасности или что-то действительно плохое, о котором я не знаю?

+1

Один из способов взглянуть на то, что вы тестируете/foo/index и/foo /: id, чтобы избежать случайного ввода файла маршрута, не понимая его ... Кто * не случайно * Все это? –

+0

Вы также должны утверждать, что true == true ... – KimJongIl

+0

@bratsche FYI: Мне нужно было найти решение для [тестирования неназначенных маршрутов] (http://stackoverflow.com/questions/18357389/how-to-test-a -controller-action-that-does-not-exist) тоже. – JJD

ответ

5

главных причин для проверки маршрутов не дважды испытаний Rails, а для проверки общественно-облицовочный API.

Это уменьшает регрессии против рекламируемых точек входа независимо от данных, которые они берут или возвращают.

уровень, чтобы проверить их, открыт для некоторых дебатов; полезно ли тестировать сам маршрут, или имеет смысл также проверять данные, поступающие в/выходящие? Выполнение этого также проверяет те же маршруты, и я бы сказал, что более ценный –, но медленнее.

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

  • Они немного напуганный, например, не болотно-стандартные маршруты
  • Я сусло отклонять некоторые маршруты
  • Во время предварительной разработки.

Предварительные испытания маршрута обычно удаляются после их проверки другими способами.

+0

Можете ли вы объяснить второй момент, когда вы должны отклонить некоторые маршруты? Вы имеете в виду, что вы явно проверяете, что определенного маршрута не существует? – bratsche

+0

@bratsche Правильно. –

+0

Что такое открытый API? – JohnOsborne

4

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

например. с помощью RSpec

describe SessionsController do 
    describe "routing" do 
    context "permitted" do 
     it "routes to #create" do 

     expect(post "sessions").to route_to("sessions#create") 

     end 
     ... 
    end 
    context "custom routes" do 
     it "routes 'login' to #new" do 

     expect(get "/login").to route_to("sessions#new") 

     end 
     ... 
    end 
    context "invalid routes" do 
     it "does not route to #edit" do 

     expect(get "/sessions/edit").not_to be_routable 

     end 
     ... 
    end 
    end 
end 
+1

Можете ли вы объяснить цель третьего контекста «недействительных маршрутов»? Это была вторая часть моего вопроса, которая несколько связана. Но если у вас есть «ресурсы: сеансы» (и вы не включаете предложение «только»), и у вас также нет метода редактирования SessionController #. Что происходит? Я никогда не делаю этого, но мне просто любопытно, есть ли какие-то огромные проблемы (например, безопасность). – bratsche

+2

Цель, для меня, в любом случае, заключается в том, чтобы я не оставил никаких открываемых маршрутов, которые я не планировал. Я думаю, что лучше избегать раскрытия любых путей через приложение, которое я открыто не открыл. Когда я делаю TDD, я включаю только маршруты (используя только): я пишу код позади. Поэтому я хочу, чтобы любые другие маршруты были заблокированы, и я хочу, чтобы мои тесты сказали мне, что это так. Это также означает, что я не могу случайно внести изменения в файл маршрутов без нарушения тестов. Лучшим примером будет индекс пользователей #, который не должен маршрутизировать, где я не хочу, чтобы он был открыт. –

Смежные вопросы