2012-09-23 44 views
0

我得到了代碼清單9.28。在Michael Hartl的Ruby on Rails教程中,我在運行bundle exec rspec spec/時遇到以下錯誤。我不知道如何清除這些錯誤。Rails教程錯誤:「驗證失敗:電子郵件已被採用」

$ bundle exec rspec spec/ 
................................................FF...........FFFFFFFF 

Failures: 

    1) User pages index profile page 
    Failure/Error: let(:user) { FactoryGirl.create(:user) } 
    ActiveRecord::RecordInvalid: 
     Validation failed: Email has already been taken 
    # ./spec/requests/user_pages_spec.rb:27:in `block (4 levels) in <top (required)>' 
    # ./spec/requests/user_pages_spec.rb:29:in `block (4 levels) in <top (required)>' 

    2) User pages index profile page 
    Failure/Error: let(:user) { FactoryGirl.create(:user) } 
    ActiveRecord::RecordInvalid: 
     Validation failed: Email has already been taken 
    # ./spec/requests/user_pages_spec.rb:27:in `block (4 levels) in <top (required)>' 
    # ./spec/requests/user_pages_spec.rb:29:in `block (4 levels) in <top (required)>' 

    3) User pages index edit page 
    Failure/Error: let(:user) { FactoryGirl.create(:user) } 
    ActiveRecord::RecordInvalid: 
     Validation failed: Email has already been taken 
    # ./spec/requests/user_pages_spec.rb:95:in `block (4 levels) in <top (required)>' 
    # ./spec/requests/user_pages_spec.rb:97:in `block (4 levels) in <top (required)>' 

    4) User pages index edit page 
    Failure/Error: let(:user) { FactoryGirl.create(:user) } 
    ActiveRecord::RecordInvalid: 
     Validation failed: Email has already been taken 
    # ./spec/requests/user_pages_spec.rb:95:in `block (4 levels) in <top (required)>' 
    # ./spec/requests/user_pages_spec.rb:97:in `block (4 levels) in <top (required)>' 

    5) User pages index edit page 
    Failure/Error: let(:user) { FactoryGirl.create(:user) } 
    ActiveRecord::RecordInvalid: 
     Validation failed: Email has already been taken 
    # ./spec/requests/user_pages_spec.rb:95:in `block (4 levels) in <top (required)>' 
    # ./spec/requests/user_pages_spec.rb:97:in `block (4 levels) in <top (required)>' 

    6) User pages index edit with valid information 
    Failure/Error: let(:user) { FactoryGirl.create(:user) } 
    ActiveRecord::RecordInvalid: 
     Validation failed: Email has already been taken 
    # ./spec/requests/user_pages_spec.rb:95:in `block (4 levels) in <top (required)>' 
    # ./spec/requests/user_pages_spec.rb:97:in `block (4 levels) in <top (required)>' 

    7) User pages index edit with valid information 
    Failure/Error: let(:user) { FactoryGirl.create(:user) } 
    ActiveRecord::RecordInvalid: 
     Validation failed: Email has already been taken 
    # ./spec/requests/user_pages_spec.rb:95:in `block (4 levels) in <top (required)>' 
    # ./spec/requests/user_pages_spec.rb:97:in `block (4 levels) in <top (required)>' 

    8) User pages index edit with valid information 
    Failure/Error: let(:user) { FactoryGirl.create(:user) } 
    ActiveRecord::RecordInvalid: 
     Validation failed: Email has already been taken 
    # ./spec/requests/user_pages_spec.rb:95:in `block (4 levels) in <top (required)>' 
    # ./spec/requests/user_pages_spec.rb:97:in `block (4 levels) in <top (required)>' 

    9) User pages index edit with valid information 
    Failure/Error: let(:user) { FactoryGirl.create(:user) } 
    ActiveRecord::RecordInvalid: 
     Validation failed: Email has already been taken 
    # ./spec/requests/user_pages_spec.rb:95:in `block (4 levels) in <top (required)>' 
    # ./spec/requests/user_pages_spec.rb:97:in `block (4 levels) in <top (required)>' 

    10) User pages index edit with valid information 
    Failure/Error: let(:user) { FactoryGirl.create(:user) } 
    ActiveRecord::RecordInvalid: 
     Validation failed: Email has already been taken 
    # ./spec/requests/user_pages_spec.rb:95:in `block (4 levels) in <top (required)>' 
    # ./spec/requests/user_pages_spec.rb:97:in `block (4 levels) in <top (required)>' 

Finished in 7.29 seconds 
69 examples, 10 failures 

Failed examples: 

rspec ./spec/requests/user_pages_spec.rb:31 # User pages index profile page 
rspec ./spec/requests/user_pages_spec.rb:32 # User pages index profile page 
rspec ./spec/requests/user_pages_spec.rb:102 # User pages index edit page 
rspec ./spec/requests/user_pages_spec.rb:103 # User pages index edit page 
rspec ./spec/requests/user_pages_spec.rb:104 # User pages index edit page 
rspec ./spec/requests/user_pages_spec.rb:118 # User pages index edit with valid information 
rspec ./spec/requests/user_pages_spec.rb:119 # User pages index edit with valid information 
rspec ./spec/requests/user_pages_spec.rb:120 # User pages index edit with valid information 
rspec ./spec/requests/user_pages_spec.rb:121 # User pages index edit with valid information 
rspec ./spec/requests/user_pages_spec.rb:122 # User pages index edit with valid information 

我user_pages_spec.rb:

require 'spec_helper' 

describe "User pages" do 

    subject { page } 


describe "index" do 
    before do 
     sign_in FactoryGirl.create(:user) 
     FactoryGirl.create(:user, name: "Bob", email: "[email protected]") 
     FactoryGirl.create(:user, name: "Ben", email: "[email protected]") 
     visit users_path 
    end 

    it { should have_selector('title', text: 'All users') } 


    it "should list each user" do 
     User.all.each do |user| 
     page.should have_selector('li', text: user.name) 
     end 

end 

describe "profile page" do 
    let(:user) { FactoryGirl.create(:user) } 

    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 

describe "signup page" do 
    before { visit signup_path } 

    it { should have_selector('h1', text: 'Sign up') } 
    it { should have_selector('title', text: full_title('Sign up')) } 
    end 

describe "signup" do 

    before { visit signup_path } 

    let(:submit) { "Create my account" } 

    describe "with invalid information" do 
     it "should not create a user" do 
     expect { click_button submit }.not_to change(User, :count) 
     end 

     describe "error messages" do 
     before { click_button submit } 

     it { should have_selector('title', text: 'Sign up') } 
     it { should have_content('error') } 
     end 
    end 

    describe "with valid information" do 
     before do 
     fill_in "Name",   with: "Example User" 
     fill_in "Email",  with: "[email protected]" 
     fill_in "Password",  with: "foobar" 
     fill_in "Confirmation", with: "foobar" 
     end 

     it "should create a user" do 
     expect { click_button submit }.to change(User, :count).by(1) 
     end 

     describe "after saving the user" do 
     before { click_button submit } 

     let(:user) { User.find_by_email('[email protected]') } 

     it { should have_selector('title', text: user.name) } 
     it { should have_selector('div.alert.alert-success', text: 'Welcome') } 
     it { should have_link('Sign out') } 

     end 
    end 
    end 

    describe "edit" do 
    let(:user) { FactoryGirl.create(:user) } 
    before do 
     sign_in user 
     visit edit_user_path(user) 
    end 

    describe "page" do 
     it { should have_selector('h1', text: "Update your profile") } 
     it { should have_selector('title', text: "Edit user") } 
     it { should have_link('change', href: 'http://gravatar.com/emails') } 
    end 

    describe "with valid information" do 
     let(:new_name) { "New Name" } 
     let(:new_email) { "[email protected]" } 
     before do 
     fill_in "Name",    with: new_name 
     fill_in "Email",   with: new_email 
     fill_in "Password",   with: user.password 
     fill_in "Confirm Password", with: user.password 
     click_button "Save changes" 
     end 

     it { should have_selector('title', text: new_name) } 
     it { should have_selector('div.alert.alert-success') } 
     it { should have_link('Sign out', href: signout_path) } 
     specify { user.reload.name.should == new_name } 
     specify { user.reload.email.should == new_email } 
    end 
    end 


    end 
end 

我的規格/請求/ authentication_pages_spec.rb是這樣的:

require 'spec_helper' 

describe "Authentication" do 

    subject { page } 

    describe "signin page" do 
    before { visit signin_path } 

    it { should have_selector('h1', text: 'Sign in') } 
    it { should have_selector('title', text: 'Sign in') } 

    end 

    describe "signin" do 
    before { visit signin_path } 

    describe "with invalid information" do 
    before { click_button "Sign in" } 

    it { should have_selector('title', text: 'Sign in') } 
    #it { should have_selector('div.flash.error', text: 'Invalid') } 

     describe "after visiting another page" do 
     before { click_link "Home" } 
     it { should_not have_selector('div.flash.error') } 
     end 
    end 

    describe "with valid information" do 
     let(:user) { FactoryGirl.create(:user) } 
     before { sign_in user } 

     it { should have_selector('title', text: user.name) } 

     it { should have_link('Users', href: users_path) } 
     it { should have_link('Profile', href: user_path(user)) } 
     it { should have_link('Settings', href: edit_user_path(user)) } 
     it { should have_link('Sign out', href: signout_path) } 
     it { should_not have_link('Sign in', href: signin_path) } 

     describe "followed by signout" do 
     before { click_link "Sign out" } 
     it { should have_link('Sign in') } 
     end 
    end 
    end 

    describe "authorization" do 

    describe "for non-signed-in users" do 
     let(:user) { Factory(:user) } 

     describe "in the Users controller" do 

     describe "visiting the edit page" do 
      before { visit edit_user_path(user) } 
      it { should have_selector('title', text: 'Sign in') } 
     end 

     describe "submitting to the update action" do 
      before { put user_path(user) } 
      specify { response.should redirect_to(signin_path) } 
     end 

     describe "visiting user index" do 
      before { visit users_path } 
      #it { should have_selector('title', text: 'Sign in') } 
     end 

     end 
    end 

    describe "as wrong user" do 
     let(:user) { FactoryGirl.create(:user) } 
     let(:wrong_user) { FactoryGirl.create(:user, email: "[email protected]") } 
     before { sign_in user } 

     describe "visiting Users#edit page" do 
     before { visit edit_user_path(wrong_user) } 
     it { should_not have_selector('title', text: full_title('Edit user')) } 
     end 

     describe "submitting a PUT request to the Users#update action" do 
     before { put user_path(wrong_user) } 
     specify { response.should redirect_to(root_path) } 
     end 
    end 
    end 
end 

我users.controller.rb看起來是這樣的:

class UsersController < ApplicationController 
    before_filter :signed_in_user, only: [:edit, :update] 
    before_filter :correct_user, only: [:edit, :update] 

    def index 
    @users = User.all 
    end 

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

    def new 
    @user = User.new 
    end 

    def create 
    @user = User.new(params[:user]) 
    if @user.save 
     sign_in @user 
     flash[:success] = "Welcome to the Sample App!" 
     redirect_to @user 
    else 
     render 'new' 
    end 
    end 

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

    def update 
    @user = User.find(params[:id]) 
    if @user.update_attributes(params[:user]) 
     flash[:success] = "Profile updated" 
     sign_in @user 
     redirect_to @user 
    else 
     render 'edit' 
    end 
    end 

    private 

    def signed_in_user 
     redirect_to signin_url, notice: "Please sign in." unless signed_in? 
    end 

    def correct_user 
     @user = User.find(params[:id]) 
     redirect_to(root_path) unless current_user?(@user) 
    end 

end 

會話。 helper.rb:

module SessionsHelper 

    def sign_in(user) 
    cookies.permanent[:remember_token] = user.remember_token 
    self.current_user = user 
    end 

    def signed_in? 
    !current_user.nil? 
    end 

    def current_user=(user) 
    @current_user = user 
    end 

    def current_user 
    @current_user ||= User.find_by_remember_token(cookies[:remember_token]) 
    end 

    def current_user?(user) 
    user == current_user 
    end 

    def signed_in_user 
    unless signed_in? 
     store_location 
     redirect_to signin_url, notice: "Please sign in." 
    end 
    end 

    def sign_out 
    current_user = nil 
    cookies.delete(:remember_token) 
    end 

    def redirect_back_or(default) 
    redirect_to(session[:return_to] || default) 
    session.delete(:return_to) 
    end 

    def store_location 
    session[:return_to] = request.url 
    end 
    end 

header.html.erb:

<header class="navbar navbar-fixed-top"> 
    <div class="navbar-inner"> 
    <div class="container"> 
     <%= link_to "sample app", root_path, id: "logo" %> 
     <nav> 
     <ul class="nav pull-right"> 
      <li><%= link_to "Home", root_path %></li> 
      <li><%= link_to "Help", help_path %></li> 
      <% if signed_in? %> 
      <li><%= link_to "Users", users_path %></li> 
      <li id="fat-menu" class="dropdown"> 
       <a href="#" class="dropdown-toggle" data-toggle="dropdown"> 
       Account <b class="caret"></b> 
       </a> 
       <ul class="dropdown-menu"> 
       <li><%= link_to "Profile", current_user %></li> 
       <li><%= link_to "Settings", edit_user_path(current_user) %></li> 
       <li class="divider"></li> 
       <li> 
        <%= link_to "Sign out", signout_path, method: "delete" %> 
       </li> 
       </ul> 
      </li> 
      <% else %> 
      <li><%= link_to "Sign in", signin_path %></li> 
      <% end %> 
     </ul> 
     </nav> 
    </div> 
    </div> 
</header> 
+0

可能最好的方法是將您的Github回購站發佈給其他人以運行您的測試。但是,看看你的錯誤信息,你有沒有把所有的測試放在'describe「索引的」do「塊中? –

回答

2

比較你user_pages_spec.rb的結構mhartl的original。由於describe "profile page" dodescribe "edit" do塊被嵌入到describe "index" do塊中,因此您肯定錯過了某些end的塊。

+0

是的,那是問題所在。我有兩端錯位。感謝原來的鏈接,所以我可以比較。 – Livi17

相關問題