metodo non definito "visita" quando si utilizzano RSpec e Capybara nei binari


89

Non riesco a far funzionare capybara con rspec. Mi dà questo errore:

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

So che ci sono molti post su questo, ma nessuna delle soluzioni funziona per me. La maggior parte di essi implica che le specifiche non siano in / spec / features, in cui si trova il mio.

Prima l'errore:

$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

Penso che sia importante notare che all'inizio stavo usando l'URL Helper "new_sessions_path" e continuava a darmi un errore undefined local variable or method 'new_sessions_path'. So che è valido perché:

$ 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

Il mio 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 all'interno di 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

Ho provato a definire il test sopra sia con che senza :type => :feature. Comunque non fa differenza. Qualche idea su cosa dovrei provare dopo?



1
@mlt nel primo paragrafo ho detto: "So che ci sono molti post su questo, ma nessuna delle soluzioni funziona per me. La maggior parte di esse riguarda le specifiche che non sono in / spec / features - in cui si trova il mio". Questo paragrafo fa specificamente riferimento alla domanda a cui ti colleghi. Questa domanda non solo ha voti più alti, ma include anche una soluzione, che è diversa dalla risposta con il voto più alto (non soluzione) pubblicata sulla tua domanda collegata.
interruttore luci05

Risposte:


201

Prova ad aggiungere:

  config.include Capybara::DSL

al tuo blocco di configurazione.

# 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

No, esattamente lo stesso problema, nessun cambiamento apparente
lightswitch05

8
Questo ha funzionato per me - grazie mille. Non avevo bisogno di farlo anche se negli altri miei progetti. Quali circostanze lo renderebbero necessario in un progetto, ma non in un altro? Inoltre, cosa sta facendo esattamente?
Peter Berg

1
Ha funzionato anche per me. Grazie mille!
Marian Zagoruiko

Il mio file aveva già la richiesta 'spec_helper' che è stata controllata come risposta a questo problema, ma per me ha funzionato. Grazie!
sixty4bit

Non funziona per me: ricevo un messaggio di errore che Capybaraè una costante indefinita. I miei test sui cetrioli utilizzano Capybara perfettamente.
digitig

53

L'aggiunta require 'rails_helper'nella parte superiore della mia funzione ha finito per risolvere il mio problema:

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

Questo mi sembra strano poiché ogni esempio che ho visto per rspec e capybara non aveva quel requisito, ma vabbè. Problema risolto.

Risposta originale (versioni precedenti di rspec)

require 'spec_helper'è utilizzato dalle versioni precedenti di RSpec. La risposta migliore sarebbe require 'rails_helper'.


4
Dovresti inserire la parte di aggiornamento nella parte superiore del tuo post.
nistvan

È davvero pessimo accettare la propria risposta, anche se la risposta di Kocur4d è più precisa (e dimenticare di includere rails_helper.rb non sarebbe il problema più comune). È necessario modificare la risposta accettata, poiché senza la modifica della configurazione eseguita prima di includerla, si avrebbe comunque lo stesso errore.
Randmin

35

Poiché Capybara 2.0 è necessario utilizzare le specifiche / caratteristiche della cartella, i comandi Capybara non funzionano più nelle specifiche / richieste della cartella.


2
Come afferma la mia domanda, il mio test di capibara era già situato sotto spec/features. Ma questo è un punto valido per altre persone che potrebbero avere problemi.
interruttore luci05

Trovo utile creare la directory mkdir spec/featurese creare un collegamento simbolico ln -s spec/features spec/requests. In questo modo tutti i test generati verranno inseriti nella directory delle caratteristiche.
omarshammas

Grazie @ThillaiNarayanan, questo era il mio problema a seguito di una vecchia guida all'installazione, ma su una versione Capybara più recente
VegaStudios

5

Prova a eseguire tutta la configurazione in un beforeblocco:

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

2
Questa è in realtà una causa comune dell'errore. La visitfunzione è disponibile solo all'interno di un itblocco. Fonte
interruttore luci05

4
Non è vero: il codice in un beforeblocco viene eseguito nel contesto di esempio, quindi visitfunzionerà sia lì che in un itblocco.
zetetic

2
@ user912563, in definitiva, dal momento che hai risolto il tuo problema, la mia risposta diventa davvero un suggerimento di stile più che altro (impostare il codice in beforeblocchi è come scrivo le mie specifiche e funzionano senza errori ;-)), quindi penso è giusto accettare la tua risposta.
Paul Fioravanti

Grazie @zetetic e @ Paul-Firavanti - non sapevo beforefosse ancora all'interno del itcontesto. L'utilizzo di questo renderà i miei altri test che richiedono l'accesso molto più puliti
lightswitch05

Questo mi ha aiutato perché sono un noob e non avevo il test racchiuso in esso "" fai ... fine.
Danny

3

Ho avuto anche questo problema,

L'aggiunta di require 'rails_helper' nella parte superiore della mia funzione ha finito per risolvere il mio problema:

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

E aggiungi "config.include Capybara :: DSL" in 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

L'aggiunta di quella riga di configurazione ha funzionato per me. È strano perché ricevevo l'errore in uno dei miei file delle specifiche ma non in un altro file delle specifiche ed entrambi hanno chiamato gli stessi metodi capy (ed entrambi hanno richiesto rails_helper)
Jonathan Tuzman
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.