Rspec и именованные маршруты

Я новичок в рельсах и пытаюсь следовать руководству по рельсам. Все идет нормально, за исключением моих тестов, которые не могут пройти именованные маршруты (5.3.3)

Мои маршруты.rb:

 SampleApp::Application.routes.draw do

 resources :users
 match '/signup',  to: 'users#new'

 match '/help',    to: 'static_pages#help'
 match '/about',   to: 'static_pages#about'
 match '/contact', to: 'pages#contact'

 root to: 'static_pages#home'

 #Commented stuff

Мои первые тесты (spec/controllers/static_pages_controller_spec.rb):

describe "Static pages" do

subject { page }

shared_examples_for "all static pages" do
  it { should have_selector('h1',    text: heading) }
  it { should have_selector('title', text: full_title(page_title)) }
end

describe "Home page" do
  before { visit root_path }
  let(:heading)    { 'Sample App' }
  let(:page_title) { 'Home' }

  it_should_behave_like "all static pages"
end

#Other tests

Spec_helper.rb выглядит так (без всех комментариев)

ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'

Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

RSpec.configure do |config|
    config.fixture_path = "#{::Rails.root}/spec/fixtures"
    config.use_transactional_fixtures = true
    config.infer_base_class_for_anonymous_controllers = false
end

Все ошибки, которые я получаю от rspec, похожи на эту:

 Static pages Home page it should behave like all static pages 
 Failure/Error: before { visit root_path }
 NameError:
   undefined local variable or method `root_path' for #<RSpec::Core::ExampleGroup::Nested_2::Nested_1::Nested_1:0x00000004a12210>
 Shared Example Group: "all static pages" called from ./spec/controllers/static_pages_controller_spec.rb:17
 # ./spec/controllers/static_pages_controller_spec.rb:13:in `block (3 levels) in <top (required)>'

я уже пробовал использовать

 include Rails.application.routes.url_helpers

в spec_helper, но он изменил мои ошибки на

 Static pages Home page it should behave like all static pages 
 Failure/Error: Unable to find matching line from backtrace
 SystemStackError:
   stack level too deep
 # /usr/lib/ruby/1.9.1/forwardable.rb:185

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

Если это может помочь в поиске проблемы, я использую Ubuntu 11.10 с rails 3.2.1 и ruby ​​1.9.2p290. Надеюсь, вы можете помочь, я довольно долго искал решение и не нашел ^^'


person FabPelletier    schedule 28.02.2012    source источник


Ответы (6)


Именованные маршруты должны работать, если вы поместите в rspec_helper.rb следующее:

RSpec.configure do |config|
  config.include Rails.application.routes.url_helpers
  ...
end

Это ты так настроил?

person Tom L    schedule 28.02.2012
comment
Это именно то, что я сделал, за исключением «config». часть. Теперь все работает идеально! Большое спасибо ! - person FabPelletier; 28.02.2012
comment
В случае, если кто-то дошел до этого места и все еще находится в тупике, также стоит отметить, что root_path (и т. д.) работает только в блоке do...end раздела it в блоке описания тестов RSpec. Поэтому, если вы создали функции для обработки его разделов на основе параметра пути, переданного функции, вы не можете передать root_path (и т. д.) в качестве параметра указанной функции. - person DreadPirateShawn; 30.01.2013
comment
Это также устранило мою проблему с предупреждением об устаревании Rails 4.2 DEPRECATION WARNING: named_routes.helpers is deprecated, please use route_defined?(route_name) to see if a named route was defined, так что теперь у меня есть чистые журналы rspec, пока я не дождусь github.com/rspec/rspec-rails/pull/1142 будет выпущен. - person Jay Killeen; 28.01.2015
comment
Я думаю, вы имеете в виду rails_helper.rb - person James Klein; 25.07.2019

Я не думаю, что у вас есть доступ к именованным маршрутам внутри спецификаций вашего контроллера rspec. Однако вы можете просто выполнить команду visit('/'), что эквивалентно root_path.

person TheDelChop    schedule 28.02.2012
comment
Спасибо, это работает хорошо, и мои тесты становятся зелеными! Тем не менее, похоже, что в учебнике используются именованные маршруты .org, и мне интересно узнать, как ^^ - person FabPelletier; 28.02.2012
comment
Добро пожаловать, просто проголосуйте и примите ответ, пожалуйста! :) - person TheDelChop; 28.02.2012
comment
Upvote требует 15 репутации, извините! Я немного подожду, прежде чем принять его, на случай, если кто-то действительно знает, как заставить его работать «как в книге» :) - person FabPelletier; 28.02.2012

Гугл привел меня сюда, даже мое сообщение об ошибке не подходит на 100%.

В моем случае команда Capybara visit неизвестна...

Ошибка:

NoMethodError:
       undefined method `visit' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_1:0xa49a73c>

Начиная с Capybara 2.0 необходимо использовать папку spec/features, команды капибары больше не работают в папке spec/requests.

Мне это помогло: http://alindeman.github.com/2012/11/11/rspec-rails-and-capybara-2.0-what-you-need-to-know.html

Надеюсь, вы найдете это полезным.

person BBQ Chef    schedule 25.03.2013

У меня была такая же проблема, с тем же учебником. Оказывается, мне нужно было просто перезапустить службу Spork, и все заработало нормально.

Решение, опубликованное Томом Л., сработало для меня, но когда я удалил эту строку и перезапустил Spork, это также решило проблему.

Надеюсь, это поможет другим людям, которые опасаются отклоняться от кода учебника!

person csalvato    schedule 23.10.2012
comment
Большое спасибо! Код @Tom L у меня не сработал. Так что это все-таки вина Спорка! Я провел весь день в поисках решения! Большое спасибо! - person Ardee Aram; 27.12.2013

Вы должны были использовать

rails generate rspec:install

вместо

rspec --init

и вам не пришлось бы изменять файл конфигурации.

Однако не делайте этого сейчас, иначе ваше приложение сломается, и вам придется потратить еще немного времени на выяснение причины его сбоя.

person Benoît Legat    schedule 13.08.2012
comment
Но ваш комментарий действительно не является решением. ;-) - person Tass; 24.04.2014

Именованные маршруты должны работать, если вы поместите следующее в rails_helper.rb, а не в spec_helper.rb:

оформить заказ в моем коде rails_helper.rb


# This file is copied to spec/ when you run 'rails generate rspec:install'
require 'spec_helper'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../config/environment', __dir__)
# Prevent database truncation if the environment is production
if Rails.env.production?
  abort('The Rails environment is running in production mode!')
end
require 'rspec/rails'
require 'capybara/rails'
RSpec.configure do |config|
  config.include Rails.application.routes.url_helpers
  config.include Devise::Test::ControllerHelpers, type: :controller
  config.include Devise::Test::ControllerHelpers, type: :view
  config.include Warden::Test::Helpers
end

begin
  ActiveRecord::Migration.maintain_test_schema!
rescue ActiveRecord::PendingMigrationError => e
  puts e.to_s.strip
  exit 1
end
RSpec.configure do |config|
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.fixture_path = "#{::Rails.root}/spec/fixtures"

  config.use_transactional_fixtures = true

  config.infer_spec_type_from_file_location!

  # Filter lines from Rails gems in backtraces.
  config.filter_rails_from_backtrace!
end

person Carlos    schedule 30.03.2020