什么是factory_girl瞬态属性?我为什么要用一个?

Jwa*_*622 14 ruby ruby-on-rails ruby-on-rails-3 factory-bot

我从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"
Run Code Online (Sandbox Code Playgroud)

所以,

  1. .upcased模型的真正属性吗?
  2. 什么是transient块真正在做什么?设置可以在工厂中使用的变量?
  3. 什么是evaluator?它总是需要最后传递吗?如果您的create函数使用特征,瞬态并具有多个值,该怎么办?

Dav*_*uth 12

factory_bot的瞬态'属性'根本不是属性; 它们只是工厂方法调用的参数,可供工厂内部的代码使用.因此,在您的示例中,不,upcased不是模型属性.

transient块列表"属性的名字(即,在传递给工厂方法的散列键),这些属性.factory_bot在新创建的模型实例上设置属性时忽略它们,除非您在工厂定义中编写代码以告诉factory_bot对它们执行某些操作.

evaluator是传递给factory_bot回调的对象.它始终是第二个块参数; 模型对象始终是第一个参数.它在概念上就像Ruby一样binding.您可以询问参数哈希中任何键的值,无论它是实际属性还是瞬态"属性".

就工厂方法的参数而言,特征和瞬态属性不会相互影响,因为特征是标量,瞬态属性是参数哈希的一部分.任何数量的真实属性和瞬态"属性"都可以在参数哈希中.

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