Saya tidak bisa membuat kapibara bekerja dengan rspec. Ini memberi saya kesalahan ini:
undefined method `visit' for #<RSpec::Core::ExampleGroup::Nested_1:0x16529f8 @example=nil>
Saya tahu ada banyak posting tentang ini tetapi tidak ada solusi yang berfungsi untuk saya. Kebanyakan dari mereka melibatkan spesifikasi yang tidak ada di / spec / features - yang saya miliki.
Pertama kesalahannya:
$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
Saya pikir penting untuk dicatat bahwa pada awalnya saya menggunakan URL Helper 'new_sessions_path' dan itu terus memberi saya kesalahan undefined local variable or method 'new_sessions_path'
. Saya tahu itu valid karena:
$ 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 saya:
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 di dalam 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
aplikasi_saya / spesifikasi / fitur / keamanan_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
Saya sudah mencoba mendefinisikan pengujian di atas dengan dan tanpa :type => :feature
. Tidak ada bedanya juga. Ada ide apa yang harus saya coba selanjutnya?
sumber
Jawaban:
Coba tambahkan:
config.include Capybara::DSL
ke blok konfigurasi Anda.
# 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
sumber
Capybara
merupakan konstanta yang tidak ditentukan. Tes ketimun saya menggunakan kapibara dengan baik.Menambahkan
require 'rails_helper'
di bagian atas fitur saya akhirnya memperbaiki masalah saya: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
Ini tampak aneh bagi saya karena setiap contoh yang pernah saya lihat untuk rspec dan kapibara tidak memiliki persyaratan itu, tapi oh baiklah. Masalah terpecahkan.
Jawaban Asli (versi rspec yang lebih lama)
require 'spec_helper'
digunakan oleh RSpec versi lama. Jawaban yang lebih baik adalahrequire 'rails_helper'
.sumber
Sejak Capybara 2.0 seseorang harus menggunakan spesifikasi / fitur folder Perintah Capybara tidak lagi berfungsi dalam spesifikasi / permintaan folder.
sumber
spec/features
. Tapi itu adalah poin yang valid untuk orang lain yang mungkin mengalami masalah.mkdir spec/features
dan membuat tautan simbolisln -s spec/features spec/requests
. Dengan cara ini semua tes yang dihasilkan akan ditempatkan di direktori fitur.Coba lakukan semua penyiapan Anda dalam satu
before
blok:spec / fitur / 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
sumber
visit
Fungsi ini hanya tersedia dalamit
blok. Sumberbefore
blok berjalan dalam konteks contoh, jadivisit
akan bekerja di sana juga diit
blok.before
blok adalah bagaimana saya menulis spesifikasi saya, dan mereka bekerja tanpa kesalahan ;-)), jadi saya pikir cukup adil untuk menerima jawaban Anda sendiri.before
apakah masih di dalamit
konteks. Menggunakan ini akan membuat tes saya yang lain yang memerlukan login jauh lebih bersihSaya juga punya masalah ini,
Menambahkan memerlukan 'rails_helper' di bagian atas fitur saya akhirnya memperbaiki masalah saya:
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
Dan tambahkan 'config.include Capybara :: DSL' di 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
sumber