web-dev-qa-db-fra.com

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

Capybara ne fonctionne pas 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 de messages à ce sujet, mais aucune des solutions ne fonctionne pour moi. La plupart d’entre elles impliquent que les spécifications ne sont pas dans/spec/features - le mien est dans.

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 que 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 dans 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

mon_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 dans les deux cas. Des idées sur ce que je devrais essayer ensuite?

86
lightswitch05

Ajouter require 'Rails_helper' au sommet de ma fonction 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 car chaque exemple que j'ai vu pour rspec et capybara n'avait 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'.

50
lightswitch05

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
194
Kocur4d

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

34

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

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
5
Paul Fioravanti

J'ai aussi eu ce problème,

L'ajout de require 'Rails_helper' en haut de ma fonctionnalité a finalement résolu 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
2
Sathibabu P