尝试使用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/

10-16 03:32