在rails中使用RSpec和Capybara时未定义的方法`访问'

我不能得到水豚与rspec工作。 它给了我这个错误:

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

我知道有很多关于这个的post,但没有解决scheme正在为我工​​作。 他们中的大多数都涉及不在/规格/function的规格 – 这是我的。

首先是错误:

 $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 Helper'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应用/规格/function/ 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 

我已经尝试在上面定义testing,有或没有:type => :feature 。 这两种方式都没有区别。 任何想法,我应该尝试下一步?

尝试添加:

  config.include Capybara::DSL 

到你的configuration块。

 # 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 

在我的function顶部添加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和水豚的每个例子都没有这个要求,但是哦。 问题解决了。

原始答案(旧版本的rspec)

旧版本的RSpec require 'spec_helper' 。 更好的答案是require 'rails_helper'

由于水豚2.0必须使用文件夹规格/function水豚命令不再在文件夹规格/请求工作了。

尝试before一个块中执行所有设置:

规格/function/ 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 

我也有这个问题,

在我的function顶部添加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 

并在rails_helper.rb中添加'config.include Capybara :: DSL'

 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