Factory Girl Newbie: Как создать новую запись, только если ее еще нет - PullRequest
9 голосов
/ 06 января 2011

Есть ли у фабричницы простой способ создать новую фабрику, только если она еще не существует?

Если не существует простого способа, каков самый краткий способ обеспечить создание только одной фабрики для набора характеристик огурца (и / или спецификаций)?

Например, мне нужна отдельная (общая) запись администратора в модели «пользователя» для тестирования нескольких функций огурца.В идеале я хотел бы сделать это, не оборачивая условия вокруг каждого шага создания администратора, но не нажимая на ошибку «запись уже существует».

Любые предложения приветствуются.

Ответы [ 3 ]

8 голосов
/ 06 января 2011

Создайте вспомогательный метод для создания или возврата одноэлементного экземпляра.

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

, а затем вызовите

create_or_return_admin_user

в своем тесте.

2 голосов
/ 06 января 2011

Вы не можете сделать это только в Factory_girl, вам нужно создать метод, проверяющий, существует ли запись или ее нет в вашей базе данных.

Если вы делаете это в настройке (до Rspec), выможет быть уверен, что есть только одна запись.

1 голос
/ 17 февраля 2012

Мы реализовали это так:

В Cucumber сценарий «фона» выполняется перед каждым «сценарием» в файле объектов. Итак, в верхней части каждого файла функций (в «фоне») мы настраиваем пользователя и назначаем ему роль администратора.

Теперь это дает вам пользователя-администратора, готового и доступного в каждом «сценарии».

Обратите внимание, что этот пользователь-администратор не выживет в БД от функции к функции, поскольку Cucumber обрабатывает записи в транзакциях. Таким образом, если вам нужно добавить что-то этому администратору в одной функции и использовать это из другой функции, этот способ сделать невозможно. Но, как я понял ваш вопрос, вы просто хотите убедиться, что вы не будете пытаться создать пользователя с правами администратора, если он уже создан. Создание пользователя-администратора в фоновом режиме гарантирует, что он создается только один раз для каждой функции.

Обратите внимание, что вместо этого вы можете создать пользователя-администратора в каждом «сценарии». Cucumber удалит его из базы данных в конце «сценария», поэтому в любой момент у вас также будет только один пользователь-администратор. Это, однако, не СУХОЙ и не должно быть сделано (если только вам не нужен пользователь-администратор в некоторых «сценариях», и, в частности, вы не должны присутствовать в других «сценариях»).

Пример 'фона' огурца с использованием определения шага FactoryGirl:

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

Заводское определение:

factory :user do
  name 'John Doe'
  role 'Guest'
end
...