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

 LOVE__NBA_977_570_587_908 发布于 2023-02-07 16:21

一个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
规格/工厂/ 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当我accountfeedback_spec.rb文件中创建一行时,该行似乎总是返回相同的UUID .

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

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

1 个回答
  • 试试这个:

    FactoryGirl.define do
      factory :account do
        uuid { SecureRandom.uuid }
        active true
      end
    end
    

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

    编辑:

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

    2023-02-07 16:23 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有