undefinierte Methode "Besuch" bei Verwendung von RSpec und Capybara in Schienen

89

Ich kann Capybara nicht dazu bringen, mit rspec zu arbeiten. Es gibt mir diesen Fehler:

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

Ich weiß, dass es viele Beiträge dazu gibt, aber keine der Lösungen funktioniert für mich. Bei den meisten handelt es sich um Spezifikationen, die nicht in / spec / features enthalten sind - in denen sich meine befinden.

Zuerst der Fehler:

$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

Ich denke, es ist wichtig zu beachten, dass ich zuerst den URL-Helfer 'new_sessions_path' verwendet habe und es mir immer wieder einen Fehler gab undefined local variable or method 'new_sessions_path'. Ich weiß, dass es gültig ist, weil:

$ 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

Mein 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 innerhalb von 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

Ich habe versucht, den obigen Test sowohl mit als auch ohne zu definieren :type => :feature. Es macht so oder so keinen Unterschied. Irgendwelche Ideen, was ich als nächstes versuchen sollte?

Lichtschalter05
quelle
Mögliches Duplikat von Capybara: undefinierte Methode 'visit'
mlt
1
@mlt im ersten Absatz sagte ich: "Ich weiß, dass es viele Beiträge dazu gibt, aber keine der Lösungen funktioniert für mich. Bei den meisten handelt es sich um Spezifikationen, die nicht in / spec / features enthalten sind - in denen sich meine befinden." Dieser Absatz bezieht sich speziell auf die Frage, auf die Sie verlinken. Diese Frage hat nicht nur höhere Stimmen, sondern auch eine Lösung, die sich von der Antwort mit der höchsten Stimme (keine Lösung) unterscheidet, die auf Ihrer verknüpften Frage veröffentlicht wurde.
Lichtschalter05

Antworten:

201

Versuchen Sie hinzuzufügen:

  config.include Capybara::DSL

zu Ihrem Konfigurationsblock.

# 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
quelle
Nein, genau das gleiche Problem, keine offensichtliche Änderung
Lichtschalter05
8
Das hat bei mir funktioniert - vielen Dank. In meinen anderen Projekten musste ich das allerdings nicht tun. Welche Umstände würden dies in einem Projekt erforderlich machen, in einem anderen jedoch nicht? Und was genau macht das?
Peter Berg
1
Hat auch für mich gearbeitet. Vielen Dank!
Marian Zagoruiko
Meine Datei hatte bereits die Anforderung 'spec_helper', die als Antwort auf dieses Problem überprüft wurde, aber dies funktionierte für mich. Vielen Dank!
Sixty4bit
Das funktioniert bei mir nicht: Ich erhalte eine Fehlermeldung, Capybaradie eine undefinierte Konstante ist. Meine Gurkentests verwenden Capybara ganz gut.
Digitig
53

Das Hinzufügen require 'rails_helper'oben in meiner Funktion hat mein Problem behoben:

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

Dies scheint mir seltsam, da jedes Beispiel, das ich für rspec und capybara gesehen habe, diese Anforderung nicht hatte, aber na ja. Problem gelöst.

Originalantwort (ältere Versionen von rspec)

require 'spec_helper'wird von älteren Versionen von RSpec verwendet. Die bessere Antwort wäre require 'rails_helper'.

Lichtschalter05
quelle
4
Sie sollten den Update-Teil oben in Ihren Beitrag einfügen.
Nistvan
Es ist wirklich eine schlechte Art, die eigene Antwort zu akzeptieren, obwohl die Antwort von Kocur4d präziser ist (und das Vergessen, die Datei rails_helper.rb einzuschließen, wäre nicht das häufigere Problem). Sie sollten die akzeptierte Antwort ändern, da ohne die vor dem Einfügen vorgenommene Konfigurationsänderung immer noch der gleiche Fehler auftritt.
Randmin
35

Seit Capybara 2.0 muss man Ordnerspezifikationen / Funktionen verwenden. Capybara-Befehle funktionieren nicht mehr in Ordnerspezifikationen / -anforderungen.

Thillai Narayanan
quelle
2
Da meine Frage Staaten, mein Capybara - Test wurde unter bereits befindet spec/features. Dies ist jedoch ein gültiger Punkt für andere Personen, die möglicherweise Probleme haben.
Lichtschalter05
Ich finde es hilfreich, das Verzeichnis zu erstellen mkdir spec/featuresund einen symbolischen Link zu erstellen ln -s spec/features spec/requests. Auf diese Weise werden alle generierten Tests im Funktionsverzeichnis abgelegt.
Omarshammas
Vielen Dank an @ThillaiNarayanan, dies war mein Problem nach einer älteren Setup-Anleitung, aber auf einer neueren Capybara-Version
VegaStudios
5

Versuchen Sie, alle Einstellungen in einem beforeBlock durchzuführen :

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
quelle
2
Dies ist tatsächlich eine häufige Ursache für den Fehler. Die visitFunktion ist nur innerhalb eines itBlocks verfügbar . Quelle
lightswitch05
4
Nicht wahr - Code in einem beforeBlock wird im Beispielkontext ausgeführt und visitfunktioniert daher sowohl dort als auch in einem itBlock.
Zetetic
2
@ user912563, letztendlich, da Sie Ihr eigenes Problem gelöst haben, wird meine Antwort vor allem zu einem Stilvorschlag (Code in beforeBlöcken einrichten ist, wie ich meine Spezifikationen schreibe, und sie funktionieren ohne Fehler ;-)), denke ich Es ist fair, deine eigene Antwort zu akzeptieren.
Paul Fioravanti
Danke @zetetic und @ Paul-Firavanti - ich wusste nicht, dass ich mich beforenoch im itKontext befinde . Mit diesem wird meine andere Tests machen , die Login viel sauberer benötigen
lightswitch05
Das hat mir geholfen, weil ich ein Noob bin und keinen Test darin "" do ... end eingewickelt habe.
Danny
3

Ich hatte auch dieses Problem,

Das Hinzufügen von require 'rails_helper' oben in meiner Funktion hat mein Problem behoben:

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

Und fügen Sie die 'config.include Capybara :: DSL' in rails_helper.rb hinzu

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.
quelle
Das Hinzufügen dieser Konfigurationszeile hat bei mir funktioniert. Es ist seltsam, weil ich den Fehler in einer meiner Spezifikationsdateien erhalten habe, aber nicht in einer anderen Spezifikationsdatei, und beide die gleichen capy-Methoden aufgerufen haben (und beide rails_helper benötigten)
Jonathan Tuzman