2015-06-27 56 views
3

我與FactoryGirl有問題,我使用序列來避免重複字段,但驗證失敗。使用FactoryGirl驗證失敗唯一性

輸出:

1) CustomersController anonymous user GET #edit is redirected to signin when accessing edit form 
    Failure/Error: get :edit, id: create(:customer) 
    ActiveRecord::RecordInvalid: 
     Validation failed: Email has already been taken, Email has already been taken 
    # ./spec/controllers/customers_controller_spec.rb:25:in `block (4 levels) in <top (required)>' 
    # -e:1:in `<main>' 

    3) Customer public class methods executes its methods correctly #find_by_id_or_name finds customer by name 
    Failure/Error: let(:john) {create(:customer, name: 'John Doe X')} 
    ActiveRecord::RecordInvalid: 
     Validation failed: Email has already been taken, Email has already been taken 
    # ./spec/models/customer_spec.rb:25:in `block (3 levels) in <top (required)>' 
    # ./spec/models/customer_spec.rb:38:in `block (5 levels) in <top (required)>' 
    # -e:1:in `<main>' 

工廠:

FactoryGirl.define do 
    factory :customer do 
    user 
    name {Faker::Name.name} 
    sequence(:mail) { |n| "person#{n}@example.com" } 
    address {Faker::Address.street_address} 
    phone {Faker::PhoneNumber.phone_number} 
    end 
end 

FactoryGirl.define do 
    factory :user do 
    sequence(:email) {|i| "example#{i}@example.com"} 
    password {Faker::Internet.password(10)} 
    end 
end 

這些是失敗的試驗:

RSpec.describe Customer, type: :model do 
    describe "public class methods" do 
     let(:john) {create(:customer, name: 'John Doe X')} 
     let(:frank) {create(:customer)} 


    context "responds to its methods" do 
     it "responds to #find_by_id_or_name" do 
     expect(Customer).to respond_to(:find_by_id_or_name) 
     end 
    end 

    context "executes its methods correctly" do 
     context "#find_by_id_or_name" do 
     it "finds customer by name" do 
      customer = Customer.find_by_id_or_name('John Doe X') 
      expect(customer).to eq john 
     end 
     it "finds customer by id" do 
      customer = Customer.find_by_id_or_name(frank.id) 
      expect(customer).to eq frank 
     end 
     end 
    end 
    end 
end 



RSpec.describe CustomersController, type: :controller do 
    context "signed in user" do 
    before :each do 
     @user = create(:user) 
    end 
    describe "GET #edit" do 
     it "renders :edit view" do 
     get :edit, id: create(:customer).id 
     expect(response).to render_template(:edit) 
     end 
    end 

    describe "DELETE #destroy" do 
     before :each do 
     @customer = create(:customer, user: @user) 
     end 
     it "deletes record" do 
     expect {delete :destroy, id: @customer.id}.to change(Customer, :count).by(-1) 
     end 
    end 
    end 
end 

這是在我的應用程序發生在我身上所有。我剛剛複製了一些適用於客戶的測試。

謝謝

+0

'''用戶'實例變量來自'DELETE#destroy'測試的'before'塊嗎?它可能與您的問題無關,但實例變量在RSpec中可能具有超級怪異行爲。 –

+0

我剛剛編輯了問題並添加了更多代碼。它在上下文中運行的塊之前被實例化 – FranGoitia

回答