2016-08-26 2 views
0

Итак, вот странная проблема: когда я запускаю свое местное приложение для рельсов и просматриваю http://localhost:3000/static_pages/help Я вижу страницу, которую я там создал. Однако тестовый сценарий, который я написал, говорит иначе.рубиновый рельс тестовый случай не работает, но реальное приложение работает

static_pages_controller_test.rb

require 'test_helper' 

class StaticPagesControllerTest < ActionController::TestCase 
    test "should get home" do 
    get :home 
    assert_response :success 
    end 

    test "should get help" do 
    puts static_pages_help_url 
    puts static_pages_help_path 
    get static_pages_help_url 
    assert_response :success 
    end  

end 

Это терпит неудачу с этой ошибкой, Вывод $ бен/тест грабли:

Running: 

..http://test.host/static_pages/help 
/static_pages/help 
E 

Finished in 0.466745s, 8.5700 runs/s, 4.2850 assertions/s. 

    1) Error. 

StaticPagesControllerTest#test_should_get_help: 
ActionController::UrlGenerationError: No route matches {:action=>"http://test.host/static_pages/help", :controller=>"static_pages"} 
    test/controllers/static_pages_controller_test.rb:12:in `block in <class:StaticPagesControllerTest>' 

Вот routes.rb

Rails.application.routes.draw do 
    get 'static_pages/home' 

    get "static_pages/help" 
end 

и здесь в static_pages_controller.rb

class StaticPagesController < ApplicationController 
    def home 
    end 

    def help 
    end 
end 

и эти два файла

app/views/static_pages/home.html.erb 
app/views/static_pages/help.html.erb 

существует, так как я могу также увидеть их при переходе к/static_pages/помощь в моем браузере. Я искал в Интернете часами, никаких подсказок.

$ rails --version 
Rails 4.2.7.1 
$ ruby --version 
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux] 

Должно быть, что-то не хватает. Пожалуйста помоги.

ответ

2

Поскольку вы пишете спецификацию контроллера, параметр GET должен быть action (метод контроллера). Но вы передаете URL-адрес. Если вы посмотрите на сообщение об ошибке, вы можете обнаружить, что "http://test.host/static_pages/help" был передан в action. Итак, передайте имя метода контроллера как symbol, а не URL. Попробуйте

get :help 

Обратите внимание, что help является действие контроллера.

Однако, если вы заинтересованы в написании теста integration, вам следует наследовать от ActionDispatch::IntegrationTest, а не ActionController::TestCase. Итак, ваша спецификация должна выглядеть как-то вроде этого.

class StaticPagesControllerTest < ActionDispatch::IntegrationTest 
    test "should get home" do 
    get static_pages_home_url 
    assert_response :success 
    end 

    test "should get help" do 
    get static_pages_help_url 
    assert_response :success 
    end   
end 

Чтобы узнать больше об интеграции и контроллере тестах см http://weblog.jamisbuck.org/2007/1/30/unit-vs-functional-vs-integration.html

Надеется, что это помогает!

+0

Большое спасибо за быстрый ответ! Что меня полностью озадачивает: почему автор этой страницы https://www.railstutorial.org/book/static_pages#code-default_controller_test написал свой тест следующим образом? Хотя на самом деле это не сработает! Это стоило мне часов ... – CodeKid

+0

@ Кодекид, не недооценивайте Хартл. Он знает свои вещи. Проблема в том, что если вы посмотрите на пример кода, данный Hartl, то на самом деле это «интеграционный тест», а то, что вы пытаетесь сделать, - это «спецификация контроллера». См. Подпись класса кода Hartl и ваш. Ваш «StaticPagesControllerTest» наследуется от «ActionController :: TestCase», а его реализация наследуется от «ActionDispatch :: IntegrationTest». Проще говоря, код Hartl пытается посетить URL-адрес и посмотреть, успешный ответ. Но спецификация контроллера отличается. –

+0

Это отвечает тому, что я действительно хотел узнать. Теперь все ясно. Огромное спасибо. – CodeKid

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