Испытания рельсов 3.1 стороны двигателя с RSpec 2


Я пытаюсь протестировать двигатель Rails 3.1 с помощью RSpec 2. После многих проб и ошибок (а также поиска документации и переполнения стека) приложение работает, и я получил большинство спецификаций для прохождения. Проблема в том, что мои спецификации маршрута все еще не работают.

Для движка " foo " с изолированным пространством имен и контроллером Foo:: BarsController, у меня есть это:

require "spec_helper"

describe Foo::BarsController do
  describe "routing" do
    it "routes to #index" do
      get("/foo/bars").should route_to("bars#index")
    end

    it "routes to #new" do
      get("/foo/bars/new").should route_to("bars#new")
    end
  end
end

Это приводит к следующему:

1) Foo::BarsController routing routes to #index
   Failure/Error: get("/foo/bars").should route_to("bars#index")
   ActionController::RoutingError:
     No route matches "/foo/bars"
   # ./spec/routing/foo/bars_routing_spec.rb:6:in `block (3 levels) in <top (required)>'

2) Foo::BarsController routing routes to #new
   Failure/Error: get("/foo/bars/new").should route_to("bars#new")
   ActionController::RoutingError:
     No route matches "/foo/bars/new"
   # ./spec/routing/foo/bars_routing_spec.rb:10:in `block (3 levels) in <top (required)>'

Похоже, что мое фиктивное приложение spec настроено правильно:

Rails.application.routes.draw do
  mount Foo::Engine => "/foo"
end

Если это помогает ответить на этот вопрос, мой взгляд спецификации также не работают. Вот типичная ошибка:

9) foo/bars/index.html.erb renders a list of bars
   Failure/Error: render
   ActionView::Template::Error:
     undefined local variable or method `new_bar_path' for #<#<Class:0x00000100c14958>:0x0000010464ceb8>
   # ./app/views/foo/bars/index.html.erb:3:in `___sers_matt__ites_foo_app_views_foo_bars_index_html_erb___1743631507081160226_2184232780'
   # ./spec/views/foo/bars/index.html.erb_spec.rb:12:in `block (2 levels) in <top (required)>'

Есть идеи?

4 2

4 ответа:

Попробуйте изменить метод get, чтобы использовать определенный маршрут

get("/foo/bars", :use_route => :foo)

Ладно, у меня получилось! И написал об этом пост в блоге.

Http://www.matthewratzloff.com/blog/2011/09/21/testing-routes-with-rails-3-1-engines/

Требуется новый метод для импорта маршрутов движка в набор маршрутов приложения для тестов.

Edit: поймал ошибку с именованной обработкой маршрута и исправил ее.

На самом деле не так уж трудно заставить это работать. Это немного банально, так как вы добавляете код к маршрутам движка.файл rb, который изменяется в зависимости от того, в каком env он выполняется. Если вы используете подход spec/dummy site для тестирования движка, то используйте следующий фрагмент кода в /config/routes.файл rb:

# <your_engine>/config/routes.rb

if Rails.env.test? && Rails.application.class.name.to_s == 'Dummy::Application'
 application = Rails.application
else
 application = YourEngine::Engine
end

application.routes.draw do
 ...
end

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

Вот официальное решение документации rspec:

Https://www.relishapp.com/rspec/rspec-rails/docs/routing-specs/engine-routes