ruby on rails 3-如何在FactoryGirl中测试删除关联



我有以下工厂:

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。如何正确删除项目?你在铁轨上不是这样做的吗?

我过去更喜欢这种方法,但现在我避免了;让工厂变得简单并在运行时填充hasmany关联更容易、更灵活。

试试这个

商店的工厂(相同):

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

相关内容

  • 没有找到相关文章

最新更新