factory_girl - отношения has_many и обновление родительской модели - PullRequest
1 голос
/ 08 марта 2011

Я продолжаю сталкиваться с той же проблемой, и я был бы удивлен, если бы я был единственным человеком, испытывающим это, и ожидал, что у кого-то есть лучший способ сделать это. Когда я создаю Фабрику, которая имеет зависимую Фабрику (ассоциацию), тогда родительская модель не обновляется с добавленной моделью. Вероятно, легче объяснить в коде.

Скажи, что у меня есть:

Factory.define :company do |a|
  a.name 'Acme'
end
Factory.define :office do |a|
  a.name 'London'
  a.association :company, :factory => :company
end

и я выполняю этот код:

london = Factory.create(:office)
sanfran = Factory.create(:office, :name => 'San Fran' , :company = london.company)

тогда, если я выполню этот тест

london.company.offices.count.should eql(2) 

это не удалось, потому что компания Acme была создана до того, как был создан Лондон или даже Сан-Франциско, и поскольку company.offices.new не использовался для создания новых моделей, модель компании никогда не обновлялась.

Единственный способ обойти эту проблему - написать тесты следующим образом:

london.company(true).offices.count.should eql(2) 

, который вызывает обновление.

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

1 Ответ

0 голосов
/ 03 июня 2011

Есть ли причина, по которой вы не можете сначала создать материнскую компанию?Кажется, у меня нет проблем с получением счетчика от предварительно созданного родительского объекта после создания дочерних объектов.

describe Company do
  describe "office associations" do
    before(:each) do
      @company = Factory(:company)
    end

    it "should have the correct number of offices" do
      o1 = Factory(:office, :company => @company) 
      o2 = Factory(:office, :company => @company) 
      @company.offices.should =~ [o1, o2].flatten # <= Not sure why, but each call to Factory appears to return an array
    end
  end
...