Как протестировать маршруты, которые не включают контроллер?

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

Допустим, у меня есть контроллер с именем Foo и действие в нем с именем bar. Итак, файл foo_controller.rb выглядит так:

class FooController < ApplicationController
  def bar
    render 'bar', :layout => 'application'
  end 
end

Дело в том, что я не хочу, чтобы люди напрямую обращались к маршруту «foo/bar». Итак, у меня есть маршрут get 'baz' => 'foo#bar'.

Теперь я хочу протестировать FooController:

require 'minitest_helper'

class FooControllerTest < ActionController::TestCase
  def test_should_get_index
    get '/baz'
  end
end

Но тест приводит к ошибке, что No route matches {:controller=>"foo", :action=>"/baz"}. Как указать контроллер для запроса GET?

Извините, если это глупый вопрос. Мне было очень трудно найти ответ.


person user5243421    schedule 29.05.2014    source источник
comment
Не утруждайте себя тестированием напрямую. Это деталь реализации вашего контроллера. Протестируйте общедоступные действия.   -  person meagar    schedule 30.05.2014


Ответы (1)


Попробуйте протестировать так:

С Rails 3:

require 'minitest_helper'

class FooControllerTest < ActionController::TestCase
  def test_should_get_index
    assert_routing "/baz", :controller => "foo", :action => "bar"
  end
end

С Rails 4:

require "test_helper"

class FooControllerTest < ActionDispatch::IntegrationTest
  def test_should_get_index
    assert_generates "/baz", :controller => "foo", :action => "bar"
  end
end
person Anderson Pierok    schedule 29.05.2014
comment
просто примечание: assert_routing по-прежнему работает в rails 4 - person dax; 05.01.2015