Error de Rails Rspec – método indefinido `visit ‘

Así que soy nuevo en TDD y estoy lanzando algunos errores Rspec aquí en mis pruebas … Básicamente, después de ejecutar bundle exec rspec spec, recibo un error de undefined method 'visit' en algunas de mis especificaciones. Cualquier ayuda sobre cómo hacer que se aprueben estas pruebas sería muy apreciada: Gracias.

 Failures: 1) User pages profile page Failure/Error: before { visit user_path(user) } NoMethodError: undefined method `visit' for #  # ./spec/requests/user_pages_spec.rb:9:in `block (3 levels) in ' 2) User pages profile page Failure/Error: before { visit user_path(user) } NoMethodError: undefined method `visit' for # # ./spec/requests/user_pages_spec.rb:9:in `block (3 levels) in ' 3) User pages signup page Failure/Error: before { visit signup_path } NoMethodError: undefined method `visit' for # # ./spec/requests/user_pages_spec.rb:16:in `block (3 levels) in ' 4) User pages signup page Failure/Error: before { visit signup_path } NoMethodError: undefined method `visit' for # # ./spec/requests/user_pages_spec.rb:16:in `block (3 levels) in ' Finished in 9.08 seconds 24 examples, 4 failures Failed examples: rspec ./spec/requests/user_pages_spec.rb:11 # User pages profile page rspec ./spec/requests/user_pages_spec.rb:12 # User pages profile page rspec ./spec/requests/user_pages_spec.rb:18 # User pages signup page rspec ./spec/requests/user_pages_spec.rb:19 # User pages signup page 

Mis especificaciones / solicitudes / user_pages_spec.rb

 require 'spec_helper' describe "User pages" do subject { page } describe "profile page" do let(:user) { FactoryGirl.create(:user) } # Code to make a user variable before { visit user_path(user) } it { should have_selector('h1', text: user.name) } it { should have_selector('title', text: user.name) } end describe "signup page" do before { visit signup_path } it { should have_selector('h1', text: 'Sign up') } it { should have_selector('title', text: 'Sign up') } end end 

Y mi spec / models / user_spec.rb

 require 'spec_helper' describe User do before do @user = User.new(name: "Example User", email: "user@example.com", password: "foobar", password_confirmation: "foobar") end subject { @user } it { should respond_to(:name) } it { should respond_to(:email) } it { should respond_to(:password_digest) } it { should respond_to(:password) } it { should respond_to(:password_confirmation) } it { should respond_to(:authenticate) } it { should be_valid } describe "when name is not present" do before { @user.name = " " } it { should_not be_valid } end describe "when email is not present" do before { @user.email = " " } it { should_not be_valid } end describe "when name is too long" do before { @user.name = "a" * 51 } it { should_not be_valid } end describe "when email format is invalid" do it "should be invalid" do addresses = %w[user@foo,com user_at_foo.org example.user@foo. foo@bar_baz.com foo@bar+baz.com] addresses.each do |invalid_address| @user.email = invalid_address @user.should_not be_valid end end end describe "when email format is valid" do it "should be valid" do addresses = %w[user@foo.COM A_US-ER@fborg frst.lst@foo.jp a+b@baz.cn] addresses.each do |valid_address| @user.email = valid_address @user.should be_valid end end end describe "when email address is already taken" do before do user_with_same_email = @user.dup user_with_same_email.email = @user.email.upcase user_with_same_email.save end it { should_not be_valid } end describe "when password is not present" do before { @user.password = @user.password_confirmation = " " } it { should_not be_valid } end describe "with a password that's too short" do before { @user.password = @user.password_confirmation = "a" * 5 } it { should be_invalid } end describe "return value of authenticate method" do before { @user.save } let(:found_user) { User.find_by_email(@user.email) } describe "with valid password" do it { should == found_user.authenticate(@user.password) } end describe "with invalid password" do let(:user_for_invalid_password) { found_user.authenticate("invalid") } it { should_not == user_for_invalid_password } specify { user_for_invalid_password.should be_false } end end describe "when password doesn't match confirmation" do before { @user.password_confirmation = "mismatch" } it { should_not be_valid } end describe "when password confirmation is nil" do before { @user.password_confirmation = nil } it { should_not be_valid } end end 

Y por último mis vistas / usuarios / new.html.erb

  

Sign up

Find me in app/views/users/new.html.erb

y vistas / usuarios / show.html.erb

  

& He añadido mi UsersController

 class UsersController < ApplicationController def new end def show @user = User.find(params[:id]) end end 

También obteniendo este nuevo error ahora después de solucionar según la solución de Billy

 Failures: 1) User pages signup page Failure/Error: it { should have_selector('title', text: 'Sign up') } Capybara::ExpectationNotMet: expected to find css "title" with text "Sign up" but there were no matches. Also found "", which matched the selector but not all filters. # ./spec/features/user_pages_spec.rb:19:in `block (3 levels) in ' 2) User pages profile page Failure/Error: it { should have_selector('title', text: user.name) } Capybara::ExpectationNotMet: expected to find css "title" with text "Michael Hartl" but there were no matches. Also found "", which matched the selector but not all filters. # ./spec/features/user_pages_spec.rb:12:in `block (3 levels) in ' Finished in 9.41 seconds 24 examples, 2 failures Failed examples: rspec ./spec/features/user_pages_spec.rb:19 # User pages signup page rspec ./spec/features/user_pages_spec.rb:12 # User pages profile page 

El problema está aquí:

 ./spec/requests/user_pages_spec.rb 

Usted pone las pruebas de integración de Capybara en la carpeta de requests . Es por eso que la visit del método no funcionará.

Para solucionarlo, simplemente mueva todas las pruebas de spec/requests a spec/features .

Esto sucede porque está intentando usar el método de visit de Capybara::DSL . Si revisa la documentación :

  Capibara ya no es compatible con
  solicitar especificaciones a partir de Capybara 2.0.0.  La forma recomendada de usar Capibara es
  con especificaciones de características.

Para resolver este problema, debe mover sus pruebas a la carpeta de spec/features o incluir Capybara::DSL para las especificaciones de la solicitud:

 #spec_helper.rb RSpec.configure do |config| #... config.include Capybara::DSL, :type => :request