2015-06-27 87 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

回答