2016-10-27 2 views
0

Я прочитал много других вопросов здесь, в SO, но никто не смог решить мою проблему (все они оказались связанными параметрами). Я надеюсь, что кто-то может мне помочь.Rails4 - Тестирование - URLGenerationError: Нет совпадений маршрутов

Выполнение теста моего контроллера я получаю сообщение:

ActionController::UrlGenerationError: No route matches 
    {:action=>"/login", :controller=>"sessions"} 
test/controllers/sessions_controller_test.rb:6:in `block in 
    <class:SessionsControllerTest>' 

Мои rake routes выглядит следующим образом:

Prefix Verb URI Pattern  Controller#Action 
login GET /login(.:format) sessions#new 
     POST /login(.:format) sessions#create 
logout DELETE /logout(.:format) sessions#destroy 

Моего сам тест является этим:

test "should get new" do 
    puts 'debug: ' + login_path 
    get login_path 
    assert_response :success 
end 

ставит отладку линейные отпечатки: debug: /login

Когда я иду в localhost:3000/login в веб-браузере загружает страницу правильно и отладочная информация ВОФК, что он использовал:

controller: sessions 
action: new 

Любая идея, почему тест не правильно перенаправлены на new действия и вместо этого ищет для несущественного действия /login? Благодаря!

EDIT: решение

После ответов ниже я нашел эту ссылку, объясняющую весь вопрос:

http://blog.bigbinary.com/2016/04/19/changes-to-test-controllers-in-rails-5.html

На Rails4 (который я использую) тесты контроллеров используют ActionController::TestCase где get :new сусло вместо get login_url (что хорошо для интеграционных тестов).

+0

Почему вы используете 'get login_path' вместо' get: new'? – ArtOfCode

+0

Просто следуйте https://www.railstutorial.org/book/basic_login Пробовал свой код и работал. Благодаря! –

+0

Интересно, будет ли он работать с учебным стилем. –

ответ

2

Метода испытаний get, post, delete и т.д., все предполагают, что любой параметр вы передаете им это имя из действий в контроллере испытывается. Таким образом, этот вызов работает:

get :new 

, потому что он генерирует url_for(:controller => :sessions, :action => :new). Этот вызов не будет:

get '/login' 

, потому что он генерирует url_for(:controller => :sessions, :action => '/login').

Используйте форму символа.

1

Правильный способ проверить это с помощью URL-адреса - написать get login_url вместо get login_path.

Это потому, что процесс тестирования не запускается в браузере, так что переменная path содержит только /login, которая представляет собой относительный путь (которое работает, когда вы видите его через браузер, так как путь добавляемый). С другой стороны, переменная url является универсальным локатором ресурсов, следовательно, это абсолютный путь , и он будет работать.

+0

Таким образом я получаю: 'Нет маршрутов, сопоставляемых {: action =>" http://test.host/login ",: controller =>" sessions "}' –

+0

@PacoAbato Erm, вы знакомы с 'test.host' ? –

+0

Я предполагаю, что это localhost. В любом случае это неудачный тест: 'ActionController :: UrlGenerationError: нет маршрутов, сопоставляемых {: action =>" http://test.host/login ",: controller =>" sessions "}' –

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