Ruby on rails Rspec-在一个系统上测试唯一性已经有很多次了

Ruby on rails Rspec-在一个系统上测试唯一性已经有很多次了,ruby-on-rails,ruby,rspec,tdd,factory-bot,Ruby On Rails,Ruby,Rspec,Tdd,Factory Bot,我试图测试一个模型可以有很多值,但不能有重复的值 我有以下模型:学校,标签,学校标签。一个学校可以有许多标签,一个标签可以属于许多学校。例如标记“艺术”、“科学”、“数学”等 class School has_many :school_tags, dependent: :destroy has_many :tags, through: :school_tags end class Tag has_many :school_tags, dependent: :destroy ha

我试图测试一个模型可以有很多值,但不能有重复的值

我有以下模型:学校,标签,学校标签。一个学校可以有许多标签,一个标签可以属于许多学校。例如标记“艺术”、“科学”、“数学”等

class School
  has_many :school_tags, dependent: :destroy
  has_many :tags, through: :school_tags
end

class Tag
  has_many :school_tags, dependent: :destroy
  has_many :schools, through: :school_tags
end

class SchoolTag < ActiveRecord::Base
  belongs_to :tag, foreign_key: 'tag_id'
  belongs_to :school, foreign_key: 'school_id'

  validates_uniqueness_of :tag_id, scope: :school_id, message: 'has already been assigned to this school'
end
班级学校
有很多:学校标签,依赖::销毁
有很多:标签,通过::学校标签
结束
类标签
有很多:学校标签,依赖::销毁
有很多:学校,通过::学校标签
结束
类SchoolTag
我目前的测试如下。它首先添加一些有效的标记,然后尝试添加已经添加到该集合中的标记

before(:each) do
  @school = FactoryGirl.create(:school)
  @tag1 = FactoryGirl.create(:tag) #creates "Test1"
  @tag2 = FactoryGirl.create(:tag) #creates "Test2"
end

it 'can have multiple tags but not duplicates' do
    @school.tags << @tag1
    @school.tags << @tag2
    expect(@school.save).to be(true) #works
    expect(@school.tags.count).to eq(2) #works

    #FAILS
    expect(@school.tags << @tag1).to raise_error(ActiveRecord::RecordInvalid)
    expect(@school.tags.count).to eq(2)
end
在(:每个)执行之前
@学校=工厂女孩。创建(:学校)
@tag1=FactoryGirl.create(:tag)#创建“Test1”
@tag2=FactoryGirl.create(:tag)#创建“Test2”
结束
它“可以有多个标签,但不能有重复的标签”

@带有提升的school.tags
expect
应包装在一个块中

expect(@school.tags << @tag1).to raise_error(ActiveRecord::RecordInvalid)
expect(@school.tags)
Failure/Error: expect(@school.tags << @tag1).to raise_error(ActiveRecord::RecordInvalid)
     ActiveRecord::RecordInvalid:
       Validation failed: Schooltype has already been assigned
expect(@school.tags << @tag1).to raise_error(ActiveRecord::RecordInvalid)
expect{@school.tags << @tag1}.to raise_error(ActiveRecord::RecordInvalid)