一个feedback
模型需要account
存在.每个account
都有一个唯一的:在模型中验证的uuid:validates :uuid, presence: true, uniqueness: true
我使用rspec来测试反馈模型,并且Uuid has already been taken
每当我构建一个feedback
对象时都会出现错误,因为反馈正在构建一个关联的account
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规格/工厂/ feedbacks.rb
FactoryGirl.define do factory :feedback do association :account message Faker::Lorem.paragraphs end end规格/工厂/ 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
正如您在accounts.rb工厂中看到的那样,uuid SecureRandom.uuid
当我account
在feedback_spec.rb
文件中创建一行时,该行似乎总是返回相同的UUID .
我想知道,FactoryGirl是否只构建帐户对象ONCE,然后为每个单独的测试重新使用它?我期待每个帐户对象都有一个唯一的UUID,但这显然不起作用.但是,当我切换到使用该sequence(:uuid) { |n| n }
线时它工作得很好.
试图了解FactoryGirl如何创建这些对象以进行测试.这显然不是我的想法.我的测试现在运行正常,但我不理解的事情最终会回来困扰我.
试试这个:
FactoryGirl.define do factory :account do uuid { SecureRandom.uuid } active true end end
这将SecureRandom.uuid
在每次调用帐户工厂时进行评估,而不是仅在FactoryGirl定义工厂时进行评估.
编辑:
有关详细信息,请参阅Factory Girl Lazy Attributes.