2013-04-21 35 views
8

Quindi sono nuovo di TDD & Sto lanciando alcuni errori Rspec qui sui miei test ... Fondamentalmente dopo l'esecuzione di bundle exec specspec spec, ottengo un errore undefined method 'visit' su alcuni di le mie specifiche Qualsiasi aiuto su come superare questi test sarebbe molto apprezzato: Grazie.Errore Rspec Rails - metodo non definito `visita '

Failures: 

1) User pages profile page 
Failure/Error: before { visit user_path(user) } 
NoMethodError: 
    undefined method `visit' for # <RSpec::Core::ExampleGroup::Nested_2::Nested_1:0x007ffda8049540> 
# ./spec/requests/user_pages_spec.rb:9:in `block (3 levels) in <top (required)>' 

2) User pages profile page 
Failure/Error: before { visit user_path(user) } 
NoMethodError: 
    undefined method `visit' for #<RSpec::Core::ExampleGroup::Nested_2::Nested_1:0x007ffda4f3ac38> 
# ./spec/requests/user_pages_spec.rb:9:in `block (3 levels) in <top (required)>' 

3) User pages signup page 
Failure/Error: before { visit signup_path } 
NoMethodError: 
    undefined method `visit' for #<RSpec::Core::ExampleGroup::Nested_2::Nested_2:0x007ffda8262e58> 
# ./spec/requests/user_pages_spec.rb:16:in `block (3 levels) in <top (required)>' 

4) User pages signup page 
Failure/Error: before { visit signup_path } 
NoMethodError: 
    undefined method `visit' for #<RSpec::Core::ExampleGroup::Nested_2::Nested_2:0x007ffda82663c8> 
# ./spec/requests/user_pages_spec.rb:16:in `block (3 levels) in <top (required)>' 

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 

mie spec/le domande/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 

E le mie spec/modelli/user_spec.rb

require 'spec_helper' 

describe User do 

before do 
    @user = User.new(name: "Example User", email: "[email protected]", 
        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[[email protected],com user_at_foo.org [email protected] 
        [email protected]_baz.com [email protected]+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[[email protected] [email protected] [email protected] [email protected]] 
    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 

E infine il mio viste/utenti/new.html.erb

<% provide(:title, 'Sign up') %> 
<h1>Sign up</h1> 
<p>Find me in app/views/users/new.html.erb</p> 

e visualizzazioni/utenti/show.html.erb

<% provide(:title, @user.name) %> 
<h1><%= @user.name %></h1> 

& ho aggiunto il mio UsersController

class UsersController < ApplicationController 
    def new 
    end 

    def show 
    @user = User.find(params[:id]) 
    end 
end 

ottenere anche questo nuovo errore ora dopo aver fissato come per la soluzione di 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 <top (required)>' 

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 <top (required)>' 

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 

risposta

22

Il problema è qui:

./spec/requests/user_pages_spec.rb 

Hai inserito i test di integrazione Capybara nella cartella requests. Ecco perché il metodo visit non funzionerà.

Per risolvere, è sufficiente spostare tutti i test da spec/requests a spec/features.

+0

@ BB500, è necessario creare tale cartella manualmente . È anche possibile creare sottocartelle sotto ad essa come 'spec/caratteristiche/modelli'. –

+1

@ BB500, si noti che la cartella '/ features' è destinata esclusivamente ai test di integrazione che utilizzeranno Capybara. Per altri test funzionali come modello, controller, helper, ecc, non è necessario spostarli, e non avranno bisogno di Capybara DSL come 'visit'. –

+0

Grazie amico! - Ho spostato il file di prova in una nuova cartella di funzionalità e quei test sono passati. (naturalmente ora ne ho un paio di nuovi ... forse puoi vedere che cosa sta succedendo anche qui ??) Ho modificato il post. – BB500

21

Ciò si verifica perché si sta tentando di utilizzare il metodo visit da Capybara::DSL. Se si seleziona la documentation:

 
Capybara is no longer supported in 
request specs as of Capybara 2.0.0. The recommended way to use Capybara is 
with feature specs. 

Per risolvere questo problema si dovrebbe spostare i test nella cartella spec/features o includere Capybara::DSL per le specifiche richieste:

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

grazie amico - apprezzare l'aiuto. (apparentemente non ho abbastanza reputazione per "su" una risposta – BB500

+0

Capibara incluso nel file di aiuto di Rspec invece di aggiungere una nuova cartella. – Chookoos

Problemi correlati