Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

undefined method `visit' when using RSpec and Capybara in rails

I can't get capybara working with rspec. It gives me this error:

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

I know there are lots of posts about this but non of the solutions are working for me. Most of them involve the specs not being in /spec/features - which mine is in.

First the error:

$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 

I think its important to note that at first I was using the URL Helper 'new_sessions_path' and it kept giving me an error undefined local variable or method 'new_sessions_path'. I know it is valid because:

$ 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 

My 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 inside of 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 

I've tried defining the test above both with and without :type => :feature. It makes no difference either way. Any ideas what I should try next?

like image 323
lightswitch05 Avatar asked Mar 01 '13 00:03

lightswitch05


2 Answers

Try to add:

  config.include Capybara::DSL 

to your config block.

# 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 
like image 135
Kocur4d Avatar answered Oct 07 '22 16:10

Kocur4d


Adding require 'rails_helper' at the top of my feature ended up fixing my problem:

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 

This seems odd to me since every example I've seen for rspec and capybara didn't have that require, but oh well. Problem solved.

Original Answer (older versions of rspec)

require 'spec_helper' is used by older versions of RSpec. The better answer would be require 'rails_helper'.

like image 29
lightswitch05 Avatar answered Oct 07 '22 14:10

lightswitch05