2011-01-06 10 views
9

Czy istnieje prosta metoda w fabryce, aby stworzyć nową fabrykę tylko wtedy, gdy jeszcze nie istnieje?Factory Girl Newbie: Jak stworzyć nowy rekord tylko jeśli jeszcze nie istnieje

Jeśli nie ma prostego sposobu, jaki jest najbardziej zwięzły sposób zapewnienia, że ​​tylko jedna fabryka jest tworzona dla zestawu funkcji ogórka (i/lub specyfikacji)?

Na przykład potrzebuję pojedynczego (wspólnego) rekordu administratora w modelu "użytkownika" do testowania wielu funkcji ogórka. Idealnie chciałbym to zrobić bez pakowania warunków warunkowych wokół każdego kroku administratora, ale bez trafienia w błąd "już istnieje rekord".

Wszelkie sugestie doceniane.

+1

Czy to znaczy 'stworzyć nową instancję' zamiast 'utworzyć nową fabrykę'? Fabryka tworzy wystąpienia. –

Odpowiedz

8

Utwórz metodę pomocniczą, aby utworzyć lub zwrócić wystąpienie singleton.

 
def create_or_return_admin_user 
    @user ||= Factory(:user, :admin => true) 
end 

a następnie zadzwonić

create_or_return_admin_user

w swoim badaniu.

2

Nie możesz tego zrobić tylko w Factory_girl, musisz utworzyć metodę sprawdzającą, czy rekord istnieje, czy nie znajduje się w bazie danych.

Jeśli zrobisz to w konfiguracji (przed Rspec), możesz mieć pewność, że istnieje tylko jeden rekord.

1

Wdrożyliśmy go tak:

W Ogórek scenariusz „background” jest wykonywany przed każdym scenariuszu „” w pliku funkcji. Tak więc, w górnej części każdego pliku funkcji (w "tle") ustawiamy użytkownika i dajemy mu rolę administratora.

Dzięki temu użytkownik administracyjny jest gotowy i dostępny w każdym "scenariuszu".

Należy pamiętać, że ten administrator nie przeżyje w bazie danych z funkcji do funkcji, ponieważ Ogórek obsługuje rekordy w transakcjach. Jeśli więc chcesz dodać coś do tego administratora w jednej funkcji i użyć go z innej funkcji, ten sposób robienia tego nie nadaje się do użytku. Ale jak zrozumiałem twoje pytanie, po prostu chcesz się upewnić, że nie będziesz próbował utworzyć użytkownika admin, jeśli jest już utworzony. Utworzenie użytkownika admin w "tle" zapewnia, że ​​jest on tworzony tylko raz dla każdej funkcji.

Pamiętaj, że zamiast tego możesz utworzyć administratora w każdym "scenariuszu". Ogórek usunie go z bazy danych na końcu "scenariusza", więc w dowolnym momencie będziesz mieć tylko jednego administratora. Nie jest to jednak DRY i nie powinno się tego robić (chyba, że ​​potrzebujesz tylko administratora w niektórych "scenariuszach", a konkretnie, że nie jest on obecny w innych "scenariuszach").

ogórkiem 'background' przykład używając definicji kroku FactoryGirl: definicja

Background: 
    Given the following user exists: 
    | Name | Role   | 
    | Admin | Administrator | 

fabryczne:

factory :user do 
    name 'John Doe' 
    role 'Guest' 
end 
Powiązane problemy