web-dev-qa-db-fra.com

Rspec et routes nommées

Je suis assez nouveau pour Rails et j'essaie de suivre le railstutorial. Tout va bien, sauf pour mes tests qui ne peuvent pas dépasser les routes nommées (5.3.3)

My routes.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

Mes premiers tests (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

Le spec_helper.rb ressemble (sans toutes les choses commentées)

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

Les erreurs que je reçois de rspec sont toutes comme celle-ci:

 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)>'

J'ai déjà essayé d'utiliser

 include Rails.application.routes.url_helpers

dans le spec_helper, mais il a changé mes erreurs en

 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

J'ai également essayé différentes façons de renommer mes itinéraires, mais aucun n'a fonctionné. Je reviens à la version tutoriel.

Si cela peut être utile pour trouver ce qui est exactement un problème, je suis sur Ubuntu 11.10, avec Rails 3.2.1 et Ruby 1.9.2p290 J'espère que vous pouvez m'aider, j'ai passé pas mal de temps à chercher une solution sur Google et je n'en ai pas trouvé ^^ '

27
FabPelletier

Les routes nommées devraient fonctionner si vous mettez ce qui suit dans rspec_helper.rb:

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

Est-ce ainsi que vous l'avez configuré?

108
Tom L

dans rspec_helper.rb:

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

Google m'a amené ici, même mon message d'erreur ne correspond pas à 100%.

Dans mon cas, la commande Capybara visitest inconnue ...

Erreur:

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

Depuis Capybara 2.0, il faut utiliser le dossier spec/features Les commandes capybara ne fonctionnent pas dans le dossier spec/requests plus.

Cela m'a aidé: http://alindeman.github.com/2012/11/11/rspec-Rails-and-capybara-2.0-what-you-need-to-know.html

J'espère que vous trouverez cela utile.

3
BBQ Chef

Je ne pense pas que vous ayez accès aux routes nommées à l'intérieur des spécifications de votre contrôleur rspec. Vous pouvez cependant simplement visiter ('/'), qui est l'équivalent de root_path.

2
TheDelChop

J'ai eu le même problème, avec le même tutoriel. Il s'avère que je devais juste redémarrer le service Spork, et tout a bien fonctionné.

La solution publiée par Tom L a fonctionné pour moi, mais lorsque j'ai supprimé cette ligne et redémarré Spork, cela a également résolu le problème.

J'espère que cela aidera toutes les autres personnes qui hésitent à s'écarter du code du didacticiel!

2
csalvato

Vous auriez dû utiliser

Rails generate rspec:install

au lieu de

rspec --init

et vous n'auriez pas eu à modifier le fichier de configuration.

Ne le faites pas maintenant cependant ou votre application va se casser et vous devrez perdre un peu plus de temps à comprendre pourquoi elle s'est cassée.

1
Benoît Legat

Les routes nommées devraient fonctionner si vous mettez ce qui suit dans Rails_helper.rb pas dans spec_helper.rb:

passer à mon code 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

0
Carlos