Я не могу заставить капибару работать с 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
. В любом случае это не имеет значения. Есть идеи, что мне попробовать дальше?
ruby-on-rails
ruby
rspec
capybara
выключатель05
источник
источник
Ответы:
Попробуй добавить:
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
источник
Capybara
является неопределенной константой. В моих тестах на огурец отлично используется капибара.Добавление
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'
.источник
Начиная с Capybara 2.0 нужно использовать спецификации / функции папки. Команды Capybara больше не работают в спецификациях / запросах папок.
источник
spec/features
. Но это верный аргумент для других людей, у которых могут быть проблемы.mkdir spec/features
и создать символическую ссылкуln -s spec/features spec/requests
. Таким образом, любые сгенерированные тесты будут помещены в каталог функций.Попробуйте выполнить всю настройку в
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
источник
visit
Функция доступна только в пределахit
блока. Источникbefore
блоке выполняется в контексте примера, поэтомуvisit
будет работать там, как и вit
блоке.before
я пишу свои спецификации с помощью блоков, и они работают без ошибок ;-)), поэтому я думаю справедливо принять свой ответ.before
все еще находится вit
контексте. Это сделает мои другие тесты, требующие входа в систему, намного чищеУ меня тоже была эта проблема,
Добавление 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
источник