undefined method `visit 'podczas używania RSpec i Capybara w szynach

89

Nie mogę zmusić kapibary do pracy z rspec. Daje mi ten błąd:

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

Wiem, że jest wiele postów na ten temat, ale żadne z rozwiązań nie działa dla mnie. Większość z nich dotyczy specyfikacji, których nie ma w / spec / features - w których jest moja.

Najpierw błąd:

$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

Myślę, że ważne jest, aby zauważyć, że na początku korzystałem z URL Helpera „new_sessions_path” i ciągle wyświetlał mi się błąd undefined local variable or method 'new_sessions_path'. Wiem, że jest ważny, ponieważ:

$ 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

Mój plik 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 wewnątrz 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

Próbowałem zdefiniować powyższy test zarówno z, jak i bez :type => :feature. Tak czy inaczej, to nie ma znaczenia. Jakieś pomysły, co powinienem spróbować dalej?

włącznik światła 05
źródło
1
@mlt w pierwszym akapicie powiedziałem: „Wiem, że jest wiele postów na ten temat, ale żadne z rozwiązań nie działa dla mnie. Większość z nich dotyczy specyfikacji, których nie ma w / spec / features - w których jest moje”. Ten paragraf odnosi się konkretnie do pytania, do którego prowadzi łącze. To pytanie nie tylko ma wyższą liczbę głosów, ale ma również rozwiązanie - różniące się od odpowiedzi, która została najwyżej oceniona (nie rozwiązanie) opublikowanej na Twoje pytanie, do którego prowadzi łącze.
włącznik światła 05

Odpowiedzi:

201

Spróbuj dodać:

  config.include Capybara::DSL

do twojego bloku konfiguracyjnego.

# 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
źródło
Nie, dokładnie ten sam problem, bez widocznej zmiany
włącznik świateł 05
8
To zadziałało dla mnie - wielkie dzięki. Nie musiałem tego robić w innych moich projektach. Jakie okoliczności sprawiłyby, że byłoby to konieczne w jednym projekcie, a w innym nie? Co dokładnie to robi?
Peter Berg,
1
U mnie też zadziałało. Dziękuję Ci bardzo!
Marian Zagoruiko
Mój plik miał już wymaganie „spec_helper”, które zostało sprawdzone jako odpowiedź na ten problem, ale to zadziałało. Dzięki!
sixty4bit
U mnie to nie działa: pojawia się komunikat o błędzie Capybarabędący nieokreśloną stałą. Moje testy ogórków używają kapibary w porządku.
digitig
53

Dodanie require 'rails_helper'u góry mojej funkcji zakończyło się naprawieniem mojego problemu:

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

Wydaje mi się to dziwne, ponieważ każdy przykład dla rspec i kapibary, jaki widziałem, nie wymagał tego, ale cóż. Problem rozwiązany.

Oryginalna odpowiedź (starsze wersje rspec)

require 'spec_helper'jest używany przez starsze wersje RSpec. Lepsza odpowiedź byłaby taka require 'rails_helper'.

włącznik światła 05
źródło
4
Powinieneś umieścić część aktualizacyjną na górze swojego posta.
nistvan
To naprawdę zły sposób, aby zaakceptować własną odpowiedź, chociaż odpowiedź Kocur4d jest bardziej precyzyjna (a zapomnienie o dołączeniu rails_helper.rb nie byłoby częstszym problemem). Powinieneś zmienić zaakceptowaną odpowiedź, ponieważ bez zmiany konfiguracji dokonanej przed jej dołączeniem, nadal miałbyś ten sam błąd.
randmin
36

Od Capybara 2.0 trzeba używać folderów spec / features Polecenia Kapibara nie działają już w folderze spec / request.

Thillai Narayanan
źródło
2
Jak stwierdza moje pytanie, mój test kapibary był już zlokalizowany pod spec/features. Ale to ważny punkt dla innych osób, które mogą mieć problemy.
włącznik światła 05
Uważam, że pomocne jest utworzenie katalogu mkdir spec/featuresi utworzenie dowiązania symbolicznego ln -s spec/features spec/requests. W ten sposób wszystkie wygenerowane testy zostaną umieszczone w katalogu funkcji.
omarshammas
Dzięki @ThillaiNarayanan, to był mój problem po starszym przewodniku konfiguracji, ale w nowszej wersji Capybara
VegaStudios
5

Spróbuj wykonać całą konfigurację w jednym beforebloku:

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
źródło
2
W rzeczywistości jest to częsta przyczyna błędu. Ta visitfunkcja jest dostępna tylko w obrębie itbloku. Źródło
włącznik świateł 05
4
Nieprawda - kod w beforebloku działa w kontekście przykładowym, więc visitbędzie działał tak samo jak w itbloku.
zetetic
2
@ user912563, ostatecznie, ponieważ rozwiązałeś swój własny problem, moja odpowiedź naprawdę staje się bardziej sugestią stylu niż cokolwiek innego (konfigurowanie kodu w beforeblokach to sposób, w jaki piszę moje specyfikacje i działają bezbłędnie ;-)), więc myślę, że sprawiedliwe jest zaakceptowanie własnej odpowiedzi.
Paul Fioravanti
Dzięki @zetetic i @ Paul-Firavanti - nie wiedziałem, że beforenadal znajduje się w itkontekście. Dzięki temu moje inne testy, które wymagają logowania, będą znacznie czystsze
lightswitch05
Pomogło mi to, ponieważ jestem noobem i nie miałem testu w tym "" zrób ... koniec.
Danny
3

Ja też miałem ten problem,

Dodanie wymagania „rails_helper” na górze mojej funkcji zakończyło się rozwiązaniem mojego problemu:

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

I dodaj „config.include Capybara :: DSL” w 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
źródło
Dodanie tej linii Config działało dla mnie. To dziwne, ponieważ otrzymałem błąd w jednym z moich plików specyfikacji, ale nie w innym pliku specyfikacji, i obie nazywały się tymi samymi metodami capy (i obie wymagały rails_helper)
Jonathan Tuzman