0

我真的不明白建立关联。在 spec_helper 我有

def log_in_user
  user = User.find_by_name 'User1'
  user = FactoryGirl.create :user1 unless user
  sign_in user
end

在 rspec

let(:product) { FactoryGirl.build :product_A }


describe "GET confirm purchase" do
    it "xxx" do
      log_in_user

      Product.should_receive(:find_active_by_id).with("1").and_return(product)

       ...
   end
end

工厂.rb

FactoryGirl.define do
    factory :user do
        encrypted_password 'abcdef1'
        confirmed_at Time.now

            factory :user1 do
              email 'user1@test.com'
              name 'User1'
              year 1984
            end
    end

    factory :product do
        factory :product_A do
          name "product A"
          association :user, factory: :user1
        end
    end
end

当我运行测试用例时发生异常:ActiveRecord::RecordInvalid: Validation failed: Email has been taken

看起来 user1 正在创建 2 次,一次在 log_in_user 中,第二次在 factory: association :user, factory: :user1

我是对的?如果是,我该如何解决这个问题?我想创建用户并在工厂产品中定义关联

最好的

4

1 回答 1

2

当你工厂:product_A时,它会自动调用工厂:user1

:user1然后您再次在 中进行工厂化log_in_user,但对唯一电子邮件的验证阻止了第二个电子邮件的:user1创建。

我建议您sequence像这样发送电子邮件:

FactoryGirl.define do
  sequence :email do |n|
    "user#{n}@test.com"
  end

  factory :user do
    encrypted_password 'abcdef1'
    confirmed_at Time.now

    factory :user1 do
      email
      name 'User1'
      year 1984
    end
  end

  factory :product do
    factory :product_A do
      name "product A"
      association :user, factory: :user1
    end
  end

end

然后,我将更sign_in_user改为将(可选)用户作为这样的选项:

def log_in_user(user)
  user =|| User.find_by_name 'User1'
  user =|| FactoryGirl.create :user1
  sign_in user
end

并修改您的测试用例以将该用户对象传递给登录:

let(:product) { FactoryGirl.build :product_A }

describe "GET confirm purchase" do
  it "xxx" do
    log_in_user(product.user)
    Product.should_receive(:find_active_by_id).with("1").and_return(product)
 end
end
于 2012-12-19T21:41:05.617 回答