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
我有一个包含默认值为 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