如何测试删除FactoryGirl中的关联?

时间:2013-02-08 00:52:17

标签: ruby-on-rails-3 factory-bot

我有以下工厂:

factory :store do
  room
  factory :store_with_items do
    ignore do
      items_count 4
    end

    after(:create) do |store, evaluator|
      FactoryGirl.create_list(:equippable_item, evaluator.items_count, store: store)
    end
  end
end

接下来,我创建一个对象:

@store = FactoryGirl.create :store_with_items

我的问题是,当我“删除”其中一个商店的商品时,商店仍会显示它有4个商品。

@store.items[0].store_id = nil
@store.save!
puts @store.items.size

看跌期权4.如何正确删除项目?这不是你在铁轨上做的吗?

1 个答案:

答案 0 :(得分:0)

我以前更喜欢这种方法,但现在我避免使用它;它更容易,更灵活,让工厂变得简单,并在运行时填充has_many关联。

试试这个

商店工厂(同):

factory :store do
  room
end

工厂项目:

factory :item do
  store # will use the store factory
end

然后在我的测试中,我会填充适用于手头案例的内容:

@store = FactoryGirl.create :store
@item1 = FactoryGirl.create :item, store: @store
@item2 = FactoryGirl.create :equippable_item_or_whatever_factory_i_use, store: @store

解释

通过明确传入商店实例,将为您设置关联。这是因为当您在FactoryGirl.createFactoryGirl.build中明确传递某些内容时,它会覆盖工厂定义中定义的内容。它甚至适用于零。这样,您将拥有真实的对象实例,为您提供所有真正的功能。

测试销毁

我认为你的例子中的代码并不好;它打破了商店和商品之间的关联,但实际上并没有删除商品记录,所以你要留下一个孤儿记录。我会这样做:

@store.items[0].destroy
puts @store.items.size

加成

如果尚未销毁父级,则您可能还希望将子级关联设置为销毁。这意味着当您说@store.destroy时,属于它的所有项目也将被销毁(从数据库中删除)。

class Store < ActiveRecord::Base
  has_many :items, dependent: :destroy
  .....
end