Factory Bot 中的瞬态属性不起作用

transient attribute in Factory Bot not working

我有一个包含默认值为 101 的单词的对象。

 trait :word do
      transient do
        width 101
      end

      after(:create) do |object, evaluator|
        word_x = "x" * evaluator.width
        object.word = word_x
      end
    end

我打电话给

create :object :word, width: 800

而且 object.word 在 ruby 测试文件中有一个长度为 800 的单词是完美的。

然而,我正在测试的 class 显示 object.word 有一个长度为 101 的单词。 就像它忘记了我设置它一样。

这是怎么回事? .

编辑:在我的 class 中,我使用 SQL 查询对象。这会影响对象吗?

您的 after(:create) 函数更改对象,但不保存更改。如果您随后从数据库中查询该对象,它将不会有更改。

obj = create(:object, :word, width: 800)
p obj.word # 800 long
p obj.changed? # true

# Re-fetch it from the database.
obj.reload
p obj.word # 101 long

作为 word 属性的一部分执行此操作会更可靠。

factory :object do
  transient do
    word_width { 11 }
  end

  word { "x" * word_width }
end