Ошибка тестового примера ruby ​​rails, но реальное приложение работает

Итак, вот странная проблема: когда я запускаю свое локальное приложение rails и перехожу к 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

Это не удается с этой ошибкой, вывод теста $ bin / rake:

 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/help в моем браузере. Я искал в Интернете часами, без понятия.

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

Я должен что-то упустить. Пожалуйста помоги.


person CodeKid    schedule 26.08.2016    source источник


Ответы (1)


Поскольку вы пишете спецификацию контроллера, параметр 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

Надеюсь это поможет!

person Arun Kumar Mohan    schedule 26.08.2016
comment
Большое спасибо за быстрый ответ! Меня совершенно озадачивает вот что: зачем автору этой страницы railstutorial.org/book/ так написать свой тест? Хотя на самом деле это не работает! Это стоило мне часов... - person CodeKid; 27.08.2016
comment
@Codekid, не недооценивай Хартла. Он знает свое дело. Проблема в том, что если вы посмотрите на пример кода, предоставленный Хартлом, на самом деле это integration test, а то, что вы пытаетесь сделать, это controller spec. См. сигнатуру класса кода Хартла и вашу. Ваш StaticPagesControllerTest is inheriting from ActionController::TestCase`, а его реализация наследуется от ActionDispatch::IntegrationTest. Проще говоря, код Хартла пытается посетить URL-адрес и проверить, является ли ответ успешным. Но спецификация контроллера другая. - person Arun Kumar Mohan; 27.08.2016
comment
Это отвечает на то, что я действительно хотел знать. Теперь все понятно. Большое спасибо. - person CodeKid; 27.08.2016