代表has_many:尽管与工厂机器人

时间:2018-07-09 18:51:21

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

给出这样的模型设置:

class Course < ApplicationRecord
  belongs_to :faculty
  has_many :teachings
  has_many :faculty, through: :teachings

  validates :name, uniqueness: { scope: [:faculty_id, :period,
                                         :semester, :year] }
end

class Faculty < ApplicationRecord
  has_secure_password

  has_many :courses
  has_many :courses, :through => :teachings

  validates :email, { presence: true, uniqueness: true }
  validates :first_name, presence: true
  validates :last_name, presence: true
  validates :password, presence: true
end

我正在尝试像这样测试课程的创建:

RSpec.describe Course, :type => :model do

  it "is valid with when period and faculty are unique" do
    course = create(:course)
    expect(course).to be_invalid
  end
end

运行测试时出现以下错误:

  

1)课程在时期和教员独特的情况下有效        失败/错误:课程=创建(:课程)

 ActiveRecord::RecordInvalid:
   Validation failed: Faculty must exist

我曾尝试过创建一个教师,并在创建课程时使用它,但仍然很幸运。

我已经研究了如何处理工厂漫游器和关系,并尝试了其中的一些方法,但是我对测试一无所知,无法使其正常工作。我希望现在就我的情况获得一些见识。

1 个答案:

答案 0 :(得分:1)

验证是在保存时运行的,您要做的是使用build

  it "is valid with when period and faculty are unique" do
    course = build(:course, faculty: create(:faculty))
    expect(course).to be_invalid
  end

这将在您要证明的情况下称为course.valid?