неопределенный метод `visit 'при использовании RSpec и Capybara в рельсах

89

Я не могу заставить капибару работать с rspec. Это дает мне эту ошибку:

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

Я знаю, что есть много сообщений об этом, но ни одно из решений не работает для меня. Большинство из них связано со спецификациями, не входящими в / spec / features, а моя.

Сначала ошибка:

$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

Я думаю, важно отметить, что сначала я использовал помощник URL-адреса new_sessions_path, и он продолжал выдавать мне ошибку undefined local variable or method 'new_sessions_path'. Я знаю, что это действительно так, потому что:

$ 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

Мой 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 внутри 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

Я пробовал определить тест выше как с, так и без него :type => :feature. В любом случае это не имеет значения. Есть идеи, что мне попробовать дальше?

выключатель05
источник
Возможный дубликат Capybara: неопределенный метод 'visit'
mlt
2
@mlt в первом абзаце я сказал: «Я знаю, что есть много сообщений об этом, но ни одно из решений не работает для меня. Большинство из них связано со спецификациями, не входящими в / spec / features, а у меня есть». В этом абзаце конкретно упоминается вопрос, на который вы ссылаетесь. Этот вопрос не только набирает больше голосов, но также имеет решение, которое отличается от ответа (а не решения), получившего наибольшее количество голосов на ваш связанный вопрос.
Lightswitch05

Ответы:

202

Попробуй добавить:

  config.include Capybara::DSL

в свой блок конфигурации.

# 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
источник
Нет, точно
такая
9
Это сработало для меня - большое спасибо. Хотя в других моих проектах мне не нужно было этого делать. Какие обстоятельства сделали бы это необходимым в одном проекте, но не в другом? Кроме того, что именно это делает?
Питер Берг
1
У меня тоже сработало. Большое спасибо!
Мариан Загоруико
В моем файле уже было требование spec_helper, которое было проверено как ответ на эту проблему, но у меня это сработало. Благодарность!
sixty4bit 08
У меня это не работает: я получаю сообщение об ошибке, которое Capybaraявляется неопределенной константой. В моих тестах на огурец отлично используется капибара.
цифра
53

Добавление require 'rails_helper'в верхней части моей функции привело к устранению моей проблемы:

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

Мне это кажется странным, поскольку в каждом примере, который я видел для rspec и capybara, этого не требовалось, ну да ладно. Задача решена.

Исходный ответ (более старые версии rspec)

require 'spec_helper'используется более старыми версиями RSpec. Был бы лучший ответ require 'rails_helper'.

выключатель05
источник
4
Вы должны поместить часть обновления в верхнюю часть своего сообщения.
nistvan
Это действительно плохой способ принимать свой собственный ответ, хотя ответ Kocur4d более точен (и забыть включить rails_helper.rb не будет более распространенной проблемой). Вы должны изменить принятый ответ, так как без изменения конфигурации, сделанного до его включения, у вас все равно будет та же ошибка.
randmin
36

Начиная с Capybara 2.0 нужно использовать спецификации / функции папки. Команды Capybara больше не работают в спецификациях / запросах папок.

Тиллай Нараянан
источник
2
Как мой вопрос состояния, мой водосвинка тест был уже находятся под spec/features. Но это верный аргумент для других людей, у которых могут быть проблемы.
Lightswitch05
Я считаю полезным создать каталог mkdir spec/featuresи создать символическую ссылку ln -s spec/features spec/requests. Таким образом, любые сгенерированные тесты будут помещены в каталог функций.
omarshammas
Спасибо @ThillaiNarayanan, это была моя проблема после более старого руководства по установке, но в более поздней версии
Capybara
5

Попробуйте выполнить всю настройку в beforeблоке:

спецификации / особенности / 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
На самом деле это частая причина ошибки. visitФункция доступна только в пределах itблока. Источник
lightswitch05 01
4
Неправда - код в beforeблоке выполняется в контексте примера, поэтому visitбудет работать там, как и в itблоке.
zetetic 01
2
@ user912563, в конечном итоге, поскольку вы решили свою проблему, мой ответ действительно становится предложением стиля больше, чем что-либо еще ( beforeя пишу свои спецификации с помощью блоков, и они работают без ошибок ;-)), поэтому я думаю справедливо принять свой ответ.
Пол Фиораванти,
Спасибо @zetetic и @ Paul-Firavanti - я не знал, что beforeвсе еще находится в itконтексте. Это сделает мои другие тесты, требующие входа в систему, намного чище
lightswitch05 01
Это помогло мне, потому что я новичок, и у меня не было завернутых в него тестов "" do ... end.
Дэнни
3

У меня тоже была эта проблема,

Добавление require 'rails_helper' в начало моей функции привело к устранению моей проблемы:

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

И добавьте config.include Capybara :: DSL в 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
Сатибабу П
источник
Добавление этой строки конфигурации сработало для меня. Это странно, потому что я получал ошибку в одном из моих файлов спецификации, но не в другом файле спецификации, и оба вызывали одни и те же методы capy (и оба требовали rails_helper)
Джонатан Тузман