我有以下工厂:
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.create
或FactoryGirl.build
中显式传递某些内容时,它会覆盖工厂定义中定义的内容。它甚至可以在零的情况下工作。通过这种方式,您将拥有真正的对象实例,这些实例将为您提供所有真正的功能。
测试销毁
我认为您的示例中的代码不好;它打破了存储和项之间的关联,但实际上并没有删除项记录,所以您留下了一个孤立记录。我会这样做:
@store.items[0].destroy
puts @store.items.size
奖金
您可能还想将子关联设置为在父关联被销毁时销毁(如果父关联尚未销毁的话)。这意味着当你说@store.destroy
时,所有属于它的物品也将被销毁(从数据库中删除)
class Store < ActiveRecord::Base
has_many :items, dependent: :destroy
.....
end