2016-03-15 35 views
10

Czytam this z Thoughtbot, ale nadal jest to dla mnie mylące.Co to są przejściowe atrybuty factory_girl? Dlaczego miałbym go używać?

To jest ich przykładem:

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" 

Więc

  1. Czy .upcased prawdziwy atrybut modelu?
  2. Co naprawdę robi blok transient? Ustawianie zmiennych, które można następnie wykorzystać w fabryce?
  3. Co to jest evaluator? Czy to zawsze musi być przekazane jako ostatnie? Co się stanie, jeśli funkcja create używa cech, przebiegów transjentów i ma wiele wartości?

Odpowiedz

7

Przejściowe "atrybuty" factory_girl nie są wcale atrybutami; to tylko parametry wywołania metody fabrycznej, które mogą być użyte przez twój kod w fabryce. Tak więc w twoim przykładzie nie, upcased nie jest atrybutem modelu.

Blokuje nazwy atrybutów (tj. Klucze w haśle przekazanym do metody fabryki) o wartości , a nie. factory_girl ignoruje je podczas ustawiania atrybutów na nowo utworzonej instancji modelu, chyba że napiszesz kod w definicji fabrycznej, aby poinformować factory_girl, że coś z nimi zrobi.

evaluator to obiekt przekazywany do callbacków factory_girl. To zawsze drugi parametr bloku; obiekt modelu jest zawsze pierwszym parametrem. Jest konceptualnie podobny do Rubiego binding. Możesz go poprosić o wartość dowolnego klucza w haśle argumentu, niezależnie od tego, czy jest to rzeczywisty atrybut, czy przejściowy "atrybut".

Cechy i atrybuty przejściowe nie wpływają na siebie nawzajem, jeśli chodzi o argumenty dotyczące metod fabryk, ponieważ cechy są skalarne, a atrybuty przejściowe są częścią argumentu hash. Dowolna liczba rzeczywistych atrybutów i przejściowych "atrybutów" może znajdować się w argumencie hash.

Oto dokumentacja factory_girl dla przypomnienia: https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md

+0

Nawet ja przeczytać dokumentację i miałem to samo zamieszanie jako przykład nie jest tak oczywiste. Dzięki: +1: – rajuGT