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?
ruby-on-rails
ruby
rspec
capybara
włącznik światła 05
źródło
źródło
Odpowiedzi:
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
źródło
Capybara
będący nieokreśloną stałą. Moje testy ogórków używają kapibary w porządku.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 takarequire 'rails_helper'
.źródło
Od Capybara 2.0 trzeba używać folderów spec / features Polecenia Kapibara nie działają już w folderze spec / request.
źródło
spec/features
. Ale to ważny punkt dla innych osób, które mogą mieć problemy.mkdir spec/features
i utworzenie dowiązania symbolicznegoln -s spec/features spec/requests
. W ten sposób wszystkie wygenerowane testy zostaną umieszczone w katalogu funkcji.Spróbuj wykonać całą konfigurację w jednym
before
bloku: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
źródło
visit
funkcja jest dostępna tylko w obrębieit
bloku. Źródłobefore
bloku działa w kontekście przykładowym, więcvisit
będzie działał tak samo jak wit
bloku.before
blokach to sposób, w jaki piszę moje specyfikacje i działają bezbłędnie ;-)), więc myślę, że sprawiedliwe jest zaakceptowanie własnej odpowiedzi.before
nadal znajduje się wit
kontekście. Dzięki temu moje inne testy, które wymagają logowania, będą znacznie czystszeJa 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
źródło