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中(尽管它不是)?