运行测试时has_many通过Factory Girl错误

时间:2014-04-25 12:44:01

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

我一直在努力建立一个使用Factory Girl的has_many关系。 我有两个模型课程和类别,一个课程可以有很多类别,我有两个工厂课程和类别。

我有这三个模型

class Course < ActiveRecord::Base
  extend FriendlyId
  friendly_id :title, use: [:slugged, :history]

  has_many :categorisations
  has_many :categories, :through=> :categorisations 
  belongs_to :partner
  belongs_to :user
 # validates_uniqueness_of :title
  validates :title, presence: true
  # validates :start_date, presence: true
  # validates :duration, presence:true
  # validates :state, presence:true
  validates :categories, length: { minimum: 1 , message:"please select"}
  validates :partner_id, presence: true, allow_nil: false
end
end

class Category < ActiveRecord::Base
  has_many :categorisations 
  has_many :courses, :through=> :categorisations
  belongs_to :user
#validation 
  validates :name, presence: true , uniqueness: { scope: :name }
end

class Categorisation < ActiveRecord::Base
  belongs_to :category
  belongs_to :course
end

工厂

FactoryGirl.define do 
  factory :course do |f|
    f.title "Introduction to Accounting short course"
    f.start_date "2014-02-27 00:00:00"
    f.duration "10 WEEKS ONLINE"
    partner 
    categorisation
   end
   # join table factory - :category
  factory :categorisation do |categorisation|
    categorisation.association :course
    categorisation.association :category
   end   
end

个人档案中的类别工厂

FactoryGirl.define do 
  factory :category do |f|
    f.name "Marketing"
  end
end

测试运行时出现的错误是:

合作伙伴有一个有效的工厂      失败/错误:期望(FactoryGirl.create(:course))。be_valid      ActiveRecord的:: RecordInvalid:        验证失败:名称已被取消

我想要做的是创建一个包含一个或多个类别的课程,我不确定我在这里做错了什么,但我需要课程工厂才有效。我知道我的分类工厂是有效的。

似乎它试图创建一个类别两次,这就是为什么它出现名称错误已经存在。

1 个答案:

答案 0 :(得分:0)

您正在创建课程两次,一次在顶部,然后在创建分类时再次创建。因为您没有链接到以前创建的课程,FactoryGirl会为您创建一个新课程。如果您在连接线之前放置一个中断,您将在关联代码中看到已经存在的内容。

您需要在联接中的行中添加课程的细节

categorisation.association :course

e.g。

categorisation.association (:course, title: "Introduction to Accounting short course")

(对不起那里的语法可能略有不同,但你明白了)