Rails FactoryGirl适用于属于其他2个模型的模型

时间:2018-04-19 15:20:26

标签: ruby-on-rails unit-testing factory-bot

我有以下三种模式:

# model/timeline.rb
class Timeline
  belongs_to :series
  belongs_to :creator
end

def series_belongs_to_creator
  if creator_id
    creator = Creator.find_by id: creator_id
    related_series = creator.series.find_by id: series_id
    errors.add(:series_id, :not_found_series) unless related_series
  end
end

# model/creator.rb
class Creator
  has_many :timelines
  has_many :series, through: :contents
end

# model/series.rb
class Series
  has_many :timelines
  has_many :creators, through: :contents
end

这不是很多关系,timelines表在另一个字段旁边有两个字段creator_idseries_id。创建时间轴时必须输入creator_idseries_id,我有一个方法series_belongs_to_creator来验证series_id必须属于creator_id才能创建成功。 那么如果使用FactoryGirl,我应该如何为时间轴模型编写工厂。我对Rails中的单元测试很困惑。

1 个答案:

答案 0 :(得分:0)

如果您使用的是Rails 5,则必须注意默认情况下belongs_to不再是可选的:https://blog.bigbinary.com/2016/02/15/rails-5-makes-belong-to-association-required-by-default.html

因此除非您指定关系是可选的,否则creator_id总是需要存在。

对于工厂来说,你最终会得到这样的东西(FactoryGirl最近被重命名为FactoryBot): http://www.rubydoc.info/gems/factory_bot/file/GETTING_STARTED.md#Associations

FactoryBot.define do
  factory :timeline do
    creator
    series
  end
end


FactoryBot.define do
  factory :creator do
    ...
  end
end


FactoryBot.define do
  factory :series do
    ...
  end
end