什么是factory_girl瞬态属性?我为什么要使用它们?

17

我阅读了Thoughtbot的这篇文章,但我仍感到困惑。

以下是他们的示例:

factory :user do
  transient do
    rockstar true
    upcased  false
  end

  name  { "John Doe#{" - Rockstar" if rockstar}" }
  email { "#{name.downcase}@example.com" }

  after(:create) do |user, evaluator|
    user.name.upcase! if evaluator.upcased
  end
end

create(:user, upcased: true).name
#=> "JOHN DOE - ROCKSTAR"

所以,

  1. .upcased 是模型上的真实属性吗?
  2. transient 块实际上是在做什么?设置变量然后可以在工厂中使用吗?
  3. evaluator 是什么?它是否总是需要最后传递?如果您的 create 函数使用 traits、transients 并具有多个值怎么办?

还可以参考这个答案:https://dev59.com/W1kT5IYBdhLWcg3wc_NR#41626919 - pdoherty926
1个回答

15

factory_bot的瞬时 “attributes” 其实不是属性; 它们只是传递给工厂方法调用的参数, 可以在工厂中由您的代码使用。所以,在您的示例中,upcased 不是模型属性。

transient 块列出 'attribute' 名称 (也就是传递给工厂方法的哈希键), 这些并不是属性. factory_bot 在设置新创建的模型实例的属性时会忽略它们,除非您在工厂定义中编写代码告诉 factory_bot 对它们执行某些操作.

evaluator 是传递给 factory_bot 回调函数的对象。它始终是第二个块参数; 模型对象始终是第一个参数。它在概念上类似于 Ruby 的 binding。您可以询问它任何关键字的值,在参数哈希中无论它是否是实际属性或瞬时“属性”。

特征和瞬态属性就工厂方法的参数而言互不影响,因为特征是标量而瞬态属性是参数哈希的一部分。参数哈希中可以包含任意数量的实际属性和瞬时“属性”。

这是 factory_bot 的文档:https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md


即使我阅读了文档,但由于示例不够清晰,我仍然感到困惑。谢谢 :+1: - rajuGT
1
这个解释比文档好多了。 - Daniel Viglione
我们中的一位应该改进文档! - Dave Schweisguth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接