2011-06-12 42 views
0

運行測試,當我遇到這些錯誤:RSPEC錯誤:驗證失敗:電子郵件已經採取了Rails的教程

1) UsersController PUT 'update' authentication of edit/update pages for non-signed-in  users should deny access to 'edit' 
    Failure/Error: @user = Factory(:user) 
    ActiveRecord::RecordInvalid: 
     Validation failed: Email has already been taken 
    # ./spec/controllers/users_controller_spec.rb:130 

    2) UsersController PUT 'update' authentication of edit/update pages for non-signed-in users should deny access to 'update' 
    Failure/Error: @user = Factory(:user) 
    ActiveRecord::RecordInvalid: 
     Validation failed: Email has already been taken 
    # ./spec/controllers/users_controller_spec.rb:130 

    3) UsersController PUT 'update' authentication of edit/update pages for signed-in users should require matching users for 'edit' 
    Failure/Error: @user = Factory(:user) 
    ActiveRecord::RecordInvalid: 
     Validation failed: Email has already been taken 
    # ./spec/controllers/users_controller_spec.rb:130 

    4) UsersController PUT 'update' authentication of edit/update pages for signed-in users should require matching users for 'update' 
    Failure/Error: @user = Factory(:user) 
    ActiveRecord::RecordInvalid: 
     Validation failed: Email has already been taken 
    # ./spec/controllers/users_controller_spec.rb:130 

    5) UsersController PUT 'update' GET 'edit' should be successful 
    Failure/Error: @user = Factory(:user) 
    ActiveRecord::RecordInvalid: 
     Validation failed: Email has already been taken 
    # ./spec/controllers/users_controller_spec.rb:168 

    6) UsersController PUT 'update' GET 'edit' should have a link to change the Gravatar 
    Failure/Error: @user = Factory(:user) 
    ActiveRecord::RecordInvalid: 
     Validation failed: Email has already been taken 
    # ./spec/controllers/users_controller_spec.rb:168 

似乎它並不喜歡這一行:

before(:each) do 
     @user = Factory(:user) 
     test_sign_in(@user) 
end 

工廠代碼

# By using the symbol ':user', we get Factory Girl to simulate the User model. 
Factory.define :user do |user| 
    user.name     "Insert Name" 
    user.email     "[email protected]" 
    user.password    "password" 
    user.password_confirmation "password" 
end 

我想這就是你想要的。

用戶控制器規格

require 'spec_helper' 

describe UsersController do 
    render_views 

    describe "GET 'show'" do 

before(:each) do 
    @user = Factory(:user) 
end 

it "should be successful" do 
    get :show, :id => @user 
    response.should be_success 
end 

it "should find the right user" do 
    get :show, :id => @user 
    assigns(:user).should == @user 
end 

it "should include the user's name" do 
    get :show, :id => @user 
    response.should have_selector("h1", :content => @user.name) 
end 

it "should have a profile image" do 
    get :show, :id => @user 
    response.should have_selector("h1>img", :class => "gravatar") 
end 
    end 

    describe "GET 'new'" do 

it "should be successful" do 
    get :new 
    response.should be_success 
end 
    end 

    describe "POST 'create'" do 

describe "failure" do 

    before(:each) do 
    @attr = { :name => "", :email => "", :password => "", :password_confirmation => "" } 
    end 

    it "should not create a user" do 
    lambda do 
     post :create, :user => @attr 
    end.should_not change(User, :count) 
    end 

    it "should render the 'new' page" do 
    post :create, :user => @attr 
    response.should render_template('new') 
    end 
    end 

describe "success" do 

    before(:each) do 
    @attr = { :name => "New User", :email => "[email protected]", :password => "password", :password_confirmation => "password" } 
    end 

    it "should create a user" do 
    lambda do 
     post :create, :user => @attr 
    end.should change(User, :count).by(1) 
    end 
    it "should have a welcome message" do 
      post :create, :user => @attr 
      flash[:success].should =~ /Welcome to InTouch/i 
    end 

    it "should sign the user in" do 
    post :create, :user => @attr 
    controller.should be_signed_in 
    end 
end 
    end 

    describe "PUT 'update'" do 

before(:each) do 
    @user = Factory(:user) 
    test_sign_in(@user) 
end 

describe "failure" do 

    before(:each) do 
    @attr = { :email => "", :name => "", :password => "", :password_cofirmation => "" } 
    end 

    it "should render the 'edit' page" do 
    put :update, :id => @user, :user => @attr 
    response.should render_template('edit') 
    end 

describe "success" do 

    before(:each) do 
    @attr = { :name => "New Name", :email => "[email protected]", :password => "newpassword", :password_confirmation => "newpassword" } 
    end 

    it "should change the user's attributes" do 
    put :update, :id => @user, :user => @attr 
    @user.reload 
    @user.name.should == @attr[:name] 
    @user.email.should == @attr[:email] 
    end 

    it "should redirect to the user show page" do 
    put :update, :id => @user, :user => @attr 
    response.should redirect_to(user_path(@user)) 
    end 

    it "should have a flash message" do 
    put :update, :id => @user, :user => @attr 
    flash[:success].should =~ /updated/ 
    end 
    end 
    end 

    describe "authentication of edit/update pages" do 

before(:each) do 
    @user = Factory(:user) 
end 

describe "for non-signed-in users" do 

    it "should deny access to 'edit'" do 
    get :edit, :id => @user 
    response.should redirect_to(signin_path) 
    end 

    it "should deny access to 'update'" do 
    put :update, :id => @user, :user => {} 
    response.should redirect_to(signin_path) 
    end 
    end 

describe "for signed-in users" do 

    before(:each) do 
    wrong_user = Factory(:user, :email => "[email protected]") 
    test_sign_in(wrong_user) 
    end 

    it "should require matching users for 'edit'" do 
    get :edit, :id => @user 
    response.should redirect_to(root_path) 
    end 

    it "should require matching users for 'update'" do 
    put :update, :id => @user, :user => {} 
    response.should redirect_to(root_path) 
    end 
    end 
    end 

    describe "GET 'edit'" do 

before(:each) do 
    @user = Factory(:user) 
    test_sign_in(@user) 
end 

it "should be successful" do 
    get :edit, :if => @user 
    response.should be_success 
end 

it "should have a link to change the Gravatar" do 
    get :edit, :id => @user 
    gravatar_url = "http://gravatar.com/emails" 
    response.should have_selector("a", :href => gravatar_url, :content => "change") 
    end 
    end 
end 
end 

回答

3

顯示我們用戶的工廠代碼。我想你會爲每個用戶使用非唯一的電子郵件。嘗試在Factory序列的幫助下爲用戶創建電子郵件。另外,檢查你的_test db重複記錄。

+1

對於您的用戶工廠電子郵件,您應該執行類似「user.sequence(:email){| n |」email#{n}@example.com「}」的操作。我認爲這是正確的語法,糾正我,如果我錯了 – 2011-06-12 20:02:36

相關問題