Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 如何使用FactoryGirl返回现有对象_Ruby On Rails 4_Rspec_Factory Bot - Fatal编程技术网

Ruby on rails 4 如何使用FactoryGirl返回现有对象

Ruby on rails 4 如何使用FactoryGirl返回现有对象,ruby-on-rails-4,rspec,factory-bot,Ruby On Rails 4,Rspec,Factory Bot,举个例子,我有一个化学元素的模型 class Element < ActiveRecord::Base validates :name, presence: true, uniqueness: true validates :symbol, presence: true, uniqueness: true end 我定义了一个工厂 FactoryGirl.define do factory :element do name "hydrogen" symbo

举个例子,我有一个化学元素的模型

class Element < ActiveRecord::Base
  validates :name, presence: true, uniqueness: true
  validates :symbol, presence: true, uniqueness: true 
end
我定义了一个工厂

FactoryGirl.define do
  factory :element do
    name "hydrogen" 
    symbol "H"
  end
end
由于codebease依赖于所有种子元素的存在,因此我使用

rake db:seed RAILS_ENV=test
现在我的工厂将永远无法运转

FactoryGirl.create(:element) #=> validation failed error
如何以一种首先尝试在数据库中查找可创建对象的方式编写工厂

FactoryGirl.create(:element) #=> returns Element from db || Factory invocation  
为什么不这样做:

element = Element.find_by(name: "hydrogen") || FactoryGirl.create(:element, name: "hydrogen", symbol: "H")
为什么不这样做:

element = Element.find_by(name: "hydrogen") || FactoryGirl.create(:element, name: "hydrogen", symbol: "H")

如果您已经为测试设置了DB种子,那么您可以使用该数据,对吗?那么就不需要工厂了。我想遵循Rails的“约定优先于配置”,因为所有测试实例都应该通过工厂以可预测和可维护的方式生成。然后,您应该使用FactoryGirl构建完整的表,而不使用种子。我想起了一些关于在规范中不使用种子的事情。有权威人士支持这一立场吗?不幸的是,在这个项目中,重构不依赖种子的规范是不可行的。。。但是你可以使用这个结构来创建FactoryGirl的动态。。。但这意味着对于每个测试,都应该创建整个结构。这将使您的测试性能降低。如果您已经为测试设置了DB种子,您可以使用该数据,对吗?那么就不需要工厂了。我想遵循Rails的“约定优先于配置”,因为所有测试实例都应该通过工厂以可预测和可维护的方式生成。然后,您应该使用FactoryGirl构建完整的表,而不使用种子。我想起了一些关于在规范中不使用种子的事情。有权威人士支持这一立场吗?不幸的是,在这个项目中,重构不依赖种子的规范是不可行的。。。但是你可以使用这个结构来创建FactoryGirl的动态。。。但这意味着对于每个测试,都应该创建整个结构。这将使您损失一些测试性能。这是不可接受的,因为每次在测试中需要元素实例时,我都必须编写这种双重逻辑。我不明白您想做什么。如果对象已经存在于数据库中,为什么要通过工厂创建对象?如果您只想使用factory,为什么不将工厂调用放在seeds.rb中(尽管它不是)?这是不可接受的,因为每次在测试中需要元素实例时,我都必须编写这个双重逻辑。我不明白您想做什么。如果对象已经存在于数据库中,为什么要通过工厂创建对象?如果您只想使用factory,为什么不将工厂调用放在seeds.rb中(尽管它不是)?