méthode non définie `visite 'lors de l'utilisation de RSpec et Capybara dans les rails

89

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

undefined method `visit' for #<RSpec::Core::ExampleGroup::Nested_1:0x16529f8 @example=nil>

Je sais qu'il y a beaucoup d'articles à ce sujet, mais aucune des solutions ne fonctionne pour moi. La plupart d'entre eux impliquent que les spécifications ne soient pas dans / spec / features - dans laquelle se trouve la mienne.

D'abord l'erreur:

$bundle exec rspec spec
F

Failures:

  1) security signs users in
     Failure/Error: visit "/sessions/new"
     NoMethodError:
       undefined method `visit' for #<RSpec::Core::ExampleGroup::Nested_1:0x16529f8 @example=nil>
     # ./spec/features/security_spec.rb:4:in `(root)'

 Finished in 0.006 seconds
 1 example, 1 failure

Failed examples:

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'URL Helper 'new_sessions_path' et cela continuait à me donner une erreur undefined local variable or method 'new_sessions_path'. Je sais que c'est valable parce que:

$ 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:

# This file is copied to spec/ when you run 'rails generate rspec:install'
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'

# Capybara integration
require 'capybara/rspec'
require 'capybara/rails'

# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

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_base_class_for_anonymous_controllers = false
  config.order = "random"
  # Include path helpers
  config.include Rails.application.routes.url_helpers
end

my_app / spec / features / security_spec.rb:

describe "security", :type => :feature do
  it "signs users in" do
    visit "/sessions/new"
    fill_in "username", :with => "user"
    fill_in "password", :with => "pass"
    click_button "Sign In"

    page.should have_content('Login Successful')
  end
end

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

lightswitch05
la source
Copie
1
@mlt dans le premier paragraphe, j'ai dit: "Je sais qu'il y a beaucoup de messages à ce sujet, mais aucune des solutions ne fonctionne pour moi. La plupart d'entre elles impliquent que les spécifications ne soient pas dans / spec / features - dans laquelle la mienne est." Ce paragraphe fait spécifiquement référence à la question à laquelle vous créez un lien. Cette question a non seulement des votes plus élevés, mais vient également avec une solution - qui est différente de la réponse la plus votée (pas de la solution) publiée sur votre question liée.
lightswitch05

Réponses:

201

Essayez d'ajouter:

  config.include Capybara::DSL

à votre bloc de configuration.

# This file is copied to spec/ when you run 'rails generate rspec:install'
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'

# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

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_base_class_for_anonymous_controllers = false
  config.order = "random"
  # Include path helpers
  config.include Rails.application.routes.url_helpers

  config.include Capybara::DSL

end
Kocur4d
la source
Non, exactement le même problème, pas de changement apparent
lightswitch05
8
Cela a fonctionné pour moi - merci beaucoup. Je n'avais pas besoin de faire cela dans mes autres projets. Quelles circonstances rendraient cela nécessaire dans un projet, mais pas dans un autre? Aussi, qu'est-ce que cela fait exactement?
Peter Berg
1
A travaillé pour moi aussi. Merci beaucoup!
Marian Zagoruiko du
Mon fichier avait déjà le require 'spec_helper' qui a été vérifié comme réponse à ce problème, mais cela a fonctionné pour moi. Merci!
sixty4bit
Cela ne fonctionne pas pour moi: j'obtiens un message d'erreur qui Capybaraest une constante non définie. Mes tests de concombre utilisent Capybara très bien.
digitig
53

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

require 'rails_helper'

describe "security", :type => :feature do

  it "signs users in" do
    visit new_sessions_path
    fill_in "username", :with => "user"
    fill_in "password", :with => "pass"
    click_button "Sign In"

    page.should have_content('Login Successful')
  end
end

Cela me semble étrange puisque tous les exemples que j'ai vus pour rspec et capybara n'avaient pas cette exigence, 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'.

lightswitch05
la source
4
Vous devriez mettre la partie mise à jour en haut de votre message.
nistvan
C'est vraiment une 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 devez modifier la réponse acceptée, car sans le changement de configuration effectué avant de l'inclure, vous auriez toujours la même erreur.
randmin
35

Depuis Capybara 2.0, il faut utiliser les spécifications / fonctionnalités de dossier Les commandes Capybara ne fonctionnent plus dans les spécifications / requêtes de dossier.

Thillai Narayanan
la source
2
Comme l'indique ma question, mon test de capybara était déjà situé sous spec/features. Mais c'est un point valable pour d'autres personnes qui pourraient avoir des problèmes.
lightswitch05
Je trouve utile de créer le répertoire mkdir spec/featureset 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.
omarshammas
Merci @ThillaiNarayanan, c'était mon problème suite à un ancien guide de configuration, mais sur une version plus récente de Capybara
VegaStudios
5

Essayez d'effectuer toute votre configuration dans un beforebloc:

spec / features / security_spec.rb

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

  it "signs users in" do
    page.should have_content('Login Successful')
  end
end
Paul Fioravanti
la source
2
C'est en fait une cause fréquente de l'erreur. levisit fonction n'est disponible que dans un itbloc. Source
lightswitch05
4
Non vrai - le code dans un beforebloc s'exécute dans le contexte de l'exemple, donc visitfonctionnera là aussi bien que dans un itbloc.
zetetic
2
@ user912563, en fin de compte, puisque vous avez résolu votre propre problème, ma réponse devient vraiment une suggestion de style plus que toute autre chose (configurer le code en beforeblocs, c'est comment j'écris mes spécifications, et elles fonctionnent sans erreur ;-)), donc je pense il est juste d'accepter votre propre réponse.
Paul Fioravanti
Merci @zetetic et @ Paul-Firavanti - je ne savais pas que beforec'était toujours dans le itcontexte. Utiliser ceci rendra mes autres tests qui nécessitent une connexion beaucoup plus propre
lightswitch05
Cela m'a aidé parce que je suis un noob et que je n'ai pas de test emballé dedans "" do ... end.
Danny
3

J'ai aussi eu ce problème,

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

require 'rails_helper'

RSpec.describe "Products", type: :request do
 describe "GET /products" do
 it "display tasks" do
  Product.create!(:name => "samsung")
  visit products_path
  page.should have_content("samsung")
  #expect(response).to have_http_status(200)
  end
 end
end

Et ajoutez le 'config.include Capybara :: DSL' dans rails_helper.rb

RSpec.configure do |config|

 config.fixture_path = "#{::Rails.root}/spec/fixtures"

 config.use_transactional_fixtures = true

 config.infer_spec_type_from_file_location!

 config.include Capybara::DSL

end
Sathibabu P
la source
L'ajout de cette ligne de configuration a fonctionné pour moi. C'est étrange parce que j'obtenais l'erreur dans l'un de mes fichiers de spécifications mais pas dans un autre fichier de spécifications, et les deux ont appelé les mêmes méthodes capy (et les deux nécessaires rails_helper)
Jonathan Tuzman