Factory Girl тестирование на Ruby on Rails, зависимости - PullRequest
2 голосов
/ 24 сентября 2010

Я пишу несколько тестов с RSpec для приложения Ruby on Rails и столкнулся с проблемой, которую, похоже, не могу понять.У меня есть куча объектов, которые связаны с другими, и я использую Factory Girl для их создания.Вот пример, где у меня возникла проблема:

    user = Factory.create(:user)
    package = Factory.build(:package, :user => user)
    item = Factory.create(:item, :package => package)

Все пакеты принадлежат пользователю, поэтому первая зависимость довольно тривиальна.Создать пользователя, а затем связать его с пакетом, без проблем.Теперь вот проблема.Моя модель пакета имеет проверку, которая говорит, что она не может быть создана без хотя бы одного элемента в пакете.Это означает, что я не могу использовать Factory.create на нем.Это почти то же самое, что делать @ Package.new в моем packages_controller.rb, и это нормально.Позже я продолжаю создавать элемент, проблема в том, что я не могу связать этот элемент с пакетом, поскольку у пакета еще нет идентификатора.

Могу ли я в любом случае создать свой пакет, создать элемент и сохранить его, а затем связать их вместе, как только у пакета будет идентификатор?

Ответы [ 3 ]

2 голосов
/ 24 сентября 2010

Проверьте связи:

http://github.com/thoughtbot/factory_girl

Связанные экземпляры могут быть созданы с помощью метода ассоциации при определении атрибута lazy:

Factory.define :post do |p|
  # ...
  p.author {|author| author.association(:user, :last_name
     'Writely') }   end

Таким образом, вы можете автоматически создать необходимый связанный элемент.

Вы захотите что-то вроде:

Factory.define :package do |fac|
  fac.association :item  
end 

Это будет искать элемент с именем Фабрики и попытаться назначить егок элементу = отношение.

0 голосов
/ 26 ноября 2015

Если я правильно понял, ваша логика выглядит немного не так.Чтобы иметь ПАКЕТ, ДОЛЖЕН ИМЕТЬ ПУНКТ;Чтобы иметь ПУНКТ, ДОЛЖЕН ИМЕТЬ ПАКЕТ.По крайней мере, один из них должен быть разрешен для создания без необходимости другого.

Если это помогает, вот как вы автоматически создаете зависимость от самой Фабрики.В этом примере Packages зависит от пользователя, а Item зависит от пакета.Волшебство здесь - это метод ассоциация .

Конечно, вы должны правильно выполнить ассоциации ваших моделей.

(во-первых, фабрика пользователей)

FactoryGirl.define do
  factory :user do
    name { "Some_Name" }
  end
end

(Тогда, Фабрика пакетов, которая зависит от Пользователя)

FactoryGirl.define do
  factory :package do
    description { "Some_Description" }
    user { association(:user) }
  end
end

(Тогда, Предмет, который зависит от Пакета)

FactoryGirl.define do
  factory :item do
    description { "Some_Description" }
    package { association(:package) }
  end
end

Надеюсь, это поможет!

0 голосов
/ 24 сентября 2010

Ваши проверки взаимоисключающие:

Модель моего пакета имеет проверку, которая говорит, что это не может быть создано без минимум один предмет в упаковке

и

(1) создайте мой пакет, (2) создайте предмет и сохраните его, затем (3) свяжите два вместе, как только пакет имеет идентификатор?

Вам необходимо разрешить создание пакета, чтобы он мог получить идентификатор. Что недействительно в пустой упаковке? Возможно, должна быть какая-то другая логика, которая препятствует его дальнейшему использованию, но должна быть возможность создать пакет перед его заполнением.

...