RSpec和FactoryGirl - 建立独特的关联?

Dan*_*n L 2 testing rspec-rails ruby-on-rails-4 factory-bot

一个feedback模型需要account存在.每个account都有一个唯一的:在模型中验证的uuid:validates :uuid, presence: true, uniqueness: true

我使用rspec来测试反馈模型,并且Uuid has already been taken每当我构建一个feedback对象时都会出现错误,因为反馈正在构建一个关联的account

规格/型号/ feedback_spec.rb

require "spec_helper"

describe Feedback do
  it "is valid with a message" do
    expect(build(:feedback)).to be_valid
  end

  it "is invalid without a message" do
    expect(build(:feedback, message: nil)).to have(1).errors_on(:message)
  end

  it "is invalid without an associated account" do
    expect(build(:feedback, account: nil)).to have(1).errors_on(:account)
  end
end
Run Code Online (Sandbox Code Playgroud)

规格/工厂/ feedbacks.rb

FactoryGirl.define do
  factory :feedback do
    association :account
    message Faker::Lorem.paragraphs
  end
end
Run Code Online (Sandbox Code Playgroud)

规格/工厂/ accounts.rb

FactoryGirl.define do
  factory :account do
    # uuid SecureRandom.uuid # THIS LINE WILL NOT WORK
    sequence(:uuid) { |n| n } # THIS LINE WORKS
    active true
  end
end
Run Code Online (Sandbox Code Playgroud)

正如您在accounts.rb工厂中看到的那样,uuid SecureRandom.uuid当我accountfeedback_spec.rb文件中创建一行时,该行似乎总是返回相同的UUID .

我想知道,FactoryGirl是否只构建帐户对象ONCE,然后为每个单独的测试重新使用它?我期待每个帐户对象都有一个唯一的UUID,但这显然不起作用.但是,当我切换到使用该sequence(:uuid) { |n| n }线时它工作得很好.

试图了解FactoryGirl如何创建这些对象以进行测试.这显然不是我的想法.我的测试现在运行正常,但我不理解的事情最终会回来困扰我.

Sam*_*Sam 12

试试这个:

FactoryGirl.define do
  factory :account do
    uuid { SecureRandom.uuid }
    active true
  end
end
Run Code Online (Sandbox Code Playgroud)

这将SecureRandom.uuid在每次调用帐户工厂时进行评估,而不是仅在FactoryGirl定义工厂时进行评估.

编辑:

有关详细信息,请参阅Factory Girl Lazy Attributes.