2013-04-21 15 views
8

Jestem nowy dla TDD & Wrzucam tutaj kilka błędów Rspec na moich testach ... Zasadniczo po uruchomieniu pakietu exec spec specyfikacji rspec, dostaję błąd undefined method 'visit' na niektórych moje specyfikacje. Jakiejkolwiek pomocy, jak sprawić by te testy minęły, byłaby bardzo doceniona: Dzięki.Błąd Rspec Railsów - niezdefiniowana metoda "odwiedź"

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 

Moi Spec/wnioski/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 

i moi Spec/Modele/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 

I wreszcie moje poglądy/users/new.html.erb

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

i widoki/użytkownicy/show.html.erb

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

& Dodałem mój UsersController

class UsersController < ApplicationController 
    def new 
    end 

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

także coraz to nowe błąd teraz po zamontowaniu zgodnie rozwiązania Billy'ego

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 

Odpowiedz

22

Problemem jest tutaj:

./spec/requests/user_pages_spec.rb 

Umieszczasz testy integracji Capybara w folderze requests. Dlatego metoda visit nie będzie działać.

Aby to naprawić, po prostu przenieś wszystkie testy z spec/requests na spec/features.

+0

@ BB500, trzeba ręcznie utworzyć ten folder . Można nawet tworzyć pod nią foldery, takie jak 'spec/features/models'. –

+1

@ BB500, należy pamiętać, że folder '/ features' jest przeznaczony wyłącznie do testów integracyjnych, które będą wykorzystywać Capybara. W przypadku innych testów funkcjonalnych, takich jak model, kontroler, pomocnicy itp., Nie trzeba ich przenosić i nie będą one wymagały stosowania takich funkcji jak "wizyta". –

+0

Dzięki! - Przeniosłem ten plik testowy do nowego folderu funkcji i te testy przeszły pomyślnie. (oczywiście, teraz mam kilka nowych ... może też zauważysz, co tu się dzieje?). Zmontowałem ten post. – BB500

21

Dzieje się tak, ponieważ próbujesz użyć metody visit z Capybara::DSL. Jeśli zaznaczysz 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. 

Aby rozwiązać ten problem, należy przenieść swoje testy spec/features folderu lub zamieścić Capybara::DSL do specyfikacji żądanie:

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

dzięki człowiekowi - doceń pomoc. (najwyraźniej nie mam wystarczającej reputacji, by "unieść" odpowiedź – BB500

+0

Dołączono Capybarę do pliku pomocy Rspec zamiast dodawać nowy folder. Praca +1 – Chookoos

Powiązane problemy