Каковы атрибуты переходного процесса factory_girl? Почему я должен использовать его?

Я прочитал этот из 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"

Итак,

  • Является ли .upcased реальным атрибутом модели?
  • Что действительно делает блок transient? Установка переменных, которые затем могут использоваться в factory?
  • Что такое evaluator? Всегда ли это нужно пропустить последним? Что делать, если ваша функция create использует черты, переходные процессы и имеет несколько значений?

Ответ 1

factory_girl transient 'attributes' не являются атрибутами вообще; они являются просто параметрами вызова метода factory, который может использоваться вашим кодом внутри factory. Итак, в вашем примере нет, upcased не является атрибутом модели.

В столбце transient перечислены атрибуты атрибута (то есть ключи в хеше, переданные методу factory), которые не являются атрибутами. factory_girl игнорирует их при настройке атрибутов только что созданного экземпляра модели, если вы не написали код в определении factory, чтобы сообщить factory_girl что-то с ними делать.

evaluator - это объект, переданный обратным вызовам factory_girl. Это всегда второй параметр блока; объект модели всегда является первым параметром. Это концептуально похоже на Ruby binding. Вы можете задать ему значение любого ключа в хеше аргумента, независимо от того, является ли он фактическим атрибутом или переходным атрибутом.

Признаки и переходные атрибуты не влияют друг на друга по отношению к аргументам методов factory, так как признаки являются скалярными, а переходные атрибуты являются частью хеша аргумента. Любое количество реальных атрибутов и переходных "атрибутов" может быть в хеше аргумента.

Здесь документация factory_girl для записи: https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md