代码之家  ›  专栏  ›  技术社区  ›  Jwan622

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

  •  17
  • Jwan622  · 技术社区  · 8 年前

    我读了 this 来自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 函数使用特征、瞬变和具有多个值?
    1 回复  |  直到 8 年前
        1
  •  15
  •   Bryan Ash    6 年前

    factorybot的瞬态“属性”根本不是属性;它们只是工厂方法调用的参数,可以由工厂内的代码使用。所以,在你的例子中,不, upcased 不是模型属性。

    这个 transient 块列表“属性”名称(即传递给工厂方法的哈希中的键) 属性。在新创建的模型实例上设置属性时,factorybot会忽略这些属性,除非您在工厂定义中编写代码,告诉factorybort对它们进行处理。

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

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

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