Создание родительских и дочерних элементов с проверкой присутствия на заводе Factory Girl

Есть проект, который имеет счета со многими поездками. Моя история пришла с просьбой, чтобы Счет-фактура ДОЛЖЕН был совершить поездку. Я добавил валидацию validates :trips, presence: true но сейчас он взрывает ряд моих тестов, поскольку FactoryGirl пытается сохранить счет-фактуру перед созданием связанной поездки.

FactoryGirl.define do
  factory :invoice do
    sequence(:invoice_id) { SecureRandom.uuid}
    merchant
    amount 100.00
    item_count 1
    paid false
    currency "GBP"
    invoice_type "pre-flight"
    service_rendered false
    cancelled false

    after(:create) { |object| create(:trip, invoice_id: object.invoice_id)}
  end

end

Что я могу сделать, чтобы создать эти объекты. Желательно на заводском уровне, так как существует множество тестов, использующих это поведение (и в настоящее время терпящих неудачу из-за него.) Это кажется хорошим решением на уровне тестирования.

Обновление Все еще борется с получением моих тестов зеленым теперь. 42 Тесты с ошибкой со следующим кодом.

Проверка не удалась: поездки не могут быть пустыми

Моя текущая обновленная строка в моем коде FactoryGirl

  before(:create) { |object| object << build(:trip, invoice_id: object.invoice_id)}

Вот и моя поездка на фабрику.

FactoryGirl.define do
  factory :trip do
    depart_airport "MCI"
    arrive_airport "ORD"
    passenger_first_name "Joe"
    passenger_last_name "Business"
    passenger_count 1
    departure_date {10.days.from_now}
    invoice
  end

end

Работая сейчас@andrykonchin был прав. Я что-то пропустил в своем before(:create)...

before(:create) { |object| object.trips << build(:trip, invoice_id: object.invoice_id)}

1 ответ

Решение

before Обратный звонок может помочь вам.

Из документации:

before (: create) - вызывается перед сохранением фабрики (через FactoryGirl.create)

Это будет выглядеть так:

before(:create) { |object| object.details << build(:invoice_detail)}
Другие вопросы по тегам