当尝试使用FactoryGirl初始化数据时,我遇到了能够访问我创建的先前数据的问题。
假设我有3种不同的型号:Product,CartItem和OrderItem。这些是基本规则:
我的工厂文件设置如下:
产品
FactoryGirl.define do
factory :product do
name "A Product"
end
end
CartItem
FactoryGirl.define do
factory :cart_item do
association :product do
Product.find_by(name: "A Product") || FactoryGirl.create(:product)
end
end
end
OrderItem的
FactoryGirl.define do
factory :order_item do
association :product do
Product.find_by(name: "A Product") || FactoryGirl.create(:product)
end
end
end
现在,在一次测试中,我首先使用此调用FactoryGirl.create(:cart_item)
一切都运行良好。因为没有Product,所以会创建一个新的,然后将其分配给CartItem。
接下来,我尝试使用此调用FactoryGirl.create(:order_item)
这次运行时,它失败并显示错误Validation failed, Name has already been taken
尝试创建名为“A Product”的新产品时失败,该产品已从创建CartItem的调用中创建。
但是,这甚至不应该尝试创建新的Product实例,因为我使用此Product.find_by("A Product") || FactoryGirl.create(:product)
设置OrderItem的产品,该产品应首先尝试在创建新产品实例之前找到该产品实例。
有关为何发生这种情况的任何想法?
答案 0 :(得分:1)
<强>更新强>
我认为您的问题与您使用association
的方式有关。我不会在任何地方看到关联会像你定义它一样阻塞。
您想要做的事情就是这样
factory :cart_item do
product { Product.find_by(name: "A Product") || association(:product) }
end
这实际上似乎是错误的,因为你创造了非决定论。相反,您应该创建一条记录并在测试中将其直接分配给工厂。
FactoryGirl.define do
factory :cart_item do
association :product
end
end
FactoryGirl.define do
factory :order_item do
association :product
end
end
然后在你的测试中
product = FactoryGirl.create(:product)
cart_item = FactoryGirl.create(:cart_item, product: product)
order_item = FactoryGirl.create(:order_item, product: product)
答案 1 :(得分:0)
这只是一个想法,但尝试在FactoryGirl配置中注释掉FactoryGirl.lint。