Factory Girl Newbie: Как создать новую запись, только если она еще не существует

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

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

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

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


person PlankTon    schedule 06.01.2011    source источник
comment
Вы имеете в виду «создать новый экземпляр», а не «создать новую фабрику»? Фабрика создает экземпляры.   -  person Tim Harding    schedule 06.01.2011


Ответы (3)


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

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

а потом позвони

create_or_return_admin_user

в вашем тесте.

person Tim Harding    schedule 06.01.2011

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

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

person shingara    schedule 06.01.2011

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

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

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

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

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

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

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

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

factory :user do
  name 'John Doe'
  role 'Guest'
end
person Jonas Bang Christensen    schedule 17.02.2012