尝试使用FactoryGirl初始化数据时,我遇到了无法访问我创建的先前数据的问题。
假设我有3种不同的模型:Product,CartItem和OrderItem。这些是基本规则:
CartItem和OrderItem属于产品,并且是必需的。
产品具有唯一的标识符“名称”。
我的工厂文件设置如下:
产品
FactoryGirl.define do
factory :product do
name "A Product"
end
end
购物车项目
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)
创建CartItem一切正常。由于没有产品,因此它将创建一个新产品,然后将其分配给CartItem。
接下来,我然后尝试使用此调用
FactoryGirl.create(:order_item)
创建OrderItem这次我运行它时,它失败并显示错误
Validation failed, Name has already been taken
尝试创建名称为“ A Product”的新产品时,此操作失败,该名称已通过创建CartItem的调用创建。
但是,这绝对不要尝试创建新的Product实例,因为我使用此
Product.find_by("A Product") || FactoryGirl.create(:product)
设置了OrderItem的产品,在创建新产品之前,该产品应首先尝试查找该产品实例。有什么想法为什么会这样?
最佳答案
更新
我相信您的问题与您使用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)
关于ruby-on-rails - FactoryGirl在数据库中找不到实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44168368/