95 votes

Méthode non définie `visit' lors de l'utilisation de RSpec et Capybara dans Rails

Je n'arrive pas à faire fonctionner capybara avec rspec. Il me donne cette erreur :

méthode non définie `visit' pour #

Je sais qu'il y a beaucoup de posts à ce sujet mais aucune des solutions ne fonctionnent pour moi. La plupart d'entre elles impliquent que les spécifications ne se trouvent pas dans /spec/features - ce qui est mon cas.

Tout d'abord l'erreur:

$bundle exec rspec spec
F

Échecs:

  1) les signes de sécurité utilisateurs
     Failure/Error: visit "/sessions/new"
     NoMethodError:
       méthode non définie `visit' pour #
     # ./spec/features/security_spec.rb:4:in `(root)'

 Terminé en 0.006 secondes
 1 exemple, 1 échec

Exemples en échec:

rspec ./spec/features/security_spec.rb:3 # security signs users in

Je pense qu'il est important de noter qu'au début j'utilisais l'assistant d'URL 'new_sessions_path' et cela me donnait une erreur variable locale ou méthode 'new_sessions_path' non définie. Je sais que c'est valide car :

$ rake routes
logout_sessions GET    /sessions/logout(.:format) sessions#logout
       sessions POST   /sessions(.:format)        sessions#create
   new_sessions GET    /sessions/new(.:format)    sessions#new
      contracts POST   /contracts(.:format)       contracts#create
  new_contracts GET    /contracts/new(.:format)   contracts#new
 edit_contracts GET    /contracts/edit(.:format)  contracts#edit
                GET    /contracts(.:format)       contracts#show
                PUT    /contracts(.:format)       contracts#update
                DELETE /contracts(.:format)       contracts#destroy
           root        /                          contracts#index

Mon Gemfile :

source 'https://rubygems.org'

gem 'rails', '3.2.11'
gem 'execjs'

group :assets do
  gem 'sass-rails',   '~> 3.2.3'
  gem 'coffee-rails', '~> 3.2.1'
  gem 'uglifier', '>= 1.0.3'
end

gem 'jquery-rails'
gem 'activerecord-oracle_enhanced-adapter', '~> 1.4.1'
gem 'jruby-openssl'
gem 'therubyrhino'
gem 'kaminari'
gem 'nokogiri'

group :development do
  gem 'warbler'
end

group :test do
  gem 'rspec-rails'
  gem 'capybara'
  gem 'activerecord-jdbcsqlite3-adapter'
end

spec_helper.rb à l'intérieur de my_app/spec:

# Ce fichier est copié dans spec/ lorsque vous exécutez 'rails generate rspec:install'
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'

# Intégration Capybara
require 'capybara/rspec'
require 'capybara/rails'

# Nécessite des fichiers ruby de support avec des matchers et des macros personnalisés, etc,
# dans le dossier spec/support/ et ses sous-dossiers.
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

RSpec.configure do |config|
  # Supprimer cette ligne si vous n'utilisez pas de fixtures ActiveRecord ou ActiveRecord
  # config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = true
  config.infer_base_class_for_anonymous_controllers = false
  config.order = "aléatoire"
  # Inclure les assistants de chemin
  config.include Rails.application.routes.url_helpers
end

my_app/spec/features/security_spec.rb:

décrire "sécurité", :type => :feature do
  il "connecte les utilisateurs" do
    visit "/sessions/new"
    fill_in "nom d'utilisateur", :with => "utilisateur"
    fill_in "mot de passe", :with => "pass"
    click_button "Se connecter"

    page.should have_content('Connexion réussie')
  end
end

J'ai essayé de définir le test ci-dessus avec et sans :type => :feature. Cela ne fait aucune différence. Des idées sur ce que je devrais essayer ensuite ?

0 votes

2 votes

@mlt dans le premier paragraphe, j'ai dit : "Je sais qu'il y a beaucoup de publications à ce sujet, mais aucune des solutions ne fonctionne pour moi. La plupart d'entre elles impliquent que les spécifications ne se trouvent pas dans /spec/features - ce qui est le cas pour moi." Ce paragraphe fait référence spécifiquement à la question à laquelle vous avez ajouté un lien. Cette question non seulement a plus de votes, mais elle est également accompagnée d'une solution - qui est différente de la réponse la plus votée (et non la solution) publiée sur la question à laquelle vous avez ajouté un lien.

213voto

Kocur4d Points 1886

Essayez d'ajouter :

  config.include Capybara::DSL

à votre bloc de configuration.

# Ce fichier est copié dans spec/ lorsque vous exécutez 'rails generate rspec:install'
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'

# Nécessite des fichiers Ruby de support avec des matchers personnalisés et des macros, etc,
# dans spec/support/ et ses sous-répertoires.
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

RSpec.configure do |config|
  # Supprimez cette ligne si vous n'utilisez pas ActiveRecord ou des fixtures ActiveRecord
  # config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = true
  config.infer_base_class_for_anonymous_controllers = false
  config.order = "random"
  # Inclure les assistants de chemin
  config.include Rails.application.routes.url_helpers

  config.include Capybara::DSL

end

0 votes

Non, exactement le même problème, aucun changement apparent

11 votes

Cela a fonctionné pour moi - merci beaucoup. Je n'avais cependant pas besoin de le faire dans mes autres projets. Dans quelles circonstances cela serait-il nécessaire dans un projet, mais pas dans un autre? De plus, que fait exactement cela?

1 votes

A également fonctionné pour moi. Merci beaucoup!

56voto

lightswitch05 Points 2312

Ajouter require 'rails_helper' en haut de ma fonctionnalité a fini par résoudre mon problème :

require 'rails_helper'

describe "sécurité", :type => :feature do

  it "connecte les utilisateurs" do
    visit new_sessions_path
    fill_in "username", :with => "utilisateur"
    fill_in "password", :with => "mot de passe"
    click_button "Se connecter"

    page.should have_content('Connexion réussie')
  end
end

Cela me semble étrange car tous les exemples que j'ai vus pour rspec et capybara n'avaient pas ce require, mais bon. Problème résolu.

Réponse originale (anciennes versions de rspec)

require 'spec_helper' est utilisé par les anciennes versions de RSpec. La meilleure réponse serait require 'rails_helper'.

4 votes

Vous devriez mettre la partie mise à jour en haut de votre message.

0 votes

Il est vraiment de mauvaise manière d'accepter sa propre réponse, même si la réponse de Kocur4d est plus précise (et oublier d'inclure le rails_helper.rb ne serait pas le problème le plus courant). Vous devriez changer la réponse acceptée, car sans le changement de configuration effectué avant de l'inclure, vous auriez toujours la même erreur.

37voto

JudeArasu Points 1266

Depuis Capybara 2.0, il faut utiliser le dossier spec/features les commandes de Capybara ne fonctionnent plus dans le dossier spec/requests.

2 votes

Comme le dit ma question, mon test de capybara était déjà situé sous spec/features. Mais c'est un point valide pour d'autres personnes qui pourraient rencontrer des problèmes.

0 votes

Je trouve utile de créer le répertoire mkdir spec/features et de créer un lien symbolique ln -s spec/features spec/requests. De cette façon, tous les tests générés seront placés dans le répertoire des fonctionnalités.

0 votes

Merci @ThillaiNarayanan, c'était mon problème en suivant un ancien guide de configuration, mais sur une version plus récente de Capybara

6voto

Paul Fioravanti Points 5886

Essayez d'effectuer toute votre configuration dans un bloc before :

spec/features/security_spec.rb

describe "sécurité" do
  before do
    visit "/sessions/new"
    fill_in "username", :with => "user"
    fill_in "password", :with => "pass"
    click_button "Sign In"

  it "connecte les utilisateurs" do
    page.should have_content('Connexion réussie')

2 votes

C'est en fait une cause fréquente de l'erreur. La fonction visit n'est disponible que dans un bloc it. Source

4 votes

Pas vrai -- le code dans un bloc before s'exécute dans le contexte de l'exemple, donc visit fonctionnera aussi bien là que dans un bloc it.

2 votes

@user912563, finalement, puisque vous avez résolu votre propre problème, ma réponse devient simplement une suggestion de style plus qu'autre chose (mettre en place du code dans des blocs before est la façon dont j'écris mes spécifications, et elles fonctionnent sans erreur ;-) ), donc je pense qu'il est juste d'accepter votre propre réponse.

3voto

eigensheep Points 11

J'ai aussi eu ce problème. Ajouter

require 'rails_helper'

en haut de la fonction a réparé le problème : probablement la même chose que lightswitch05 a rencontrée, mais avec les versions plus récentes rails_helper a pris le dessus sur spec_helper.

Cela serait probablement mieux comme commentaire sur la réponse de lightswitch05, mais je n'avais pas la réputation nécessaire

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X