Rspec - 在has_many上测试唯一性

时间:2015-09-08 22:39:12

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

我正在尝试测试模型可以有多个值,但不能重复值。

我有以下型号:school,tag,school_tag。学校可以有许多标签,标签可以属于许多学校。一个示例标签,'艺术','科学','数学'等

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

我目前的测试如下。它首先添加一些有效标签,然后尝试添加已添加到该集合的标签。

expect(@school.tags << @tag1).to raise_error(ActiveRecord::RecordInvalid)

失败的部分在这里:

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

这是我回来的错误:

<<

是否与使用{{1}}有关?我该如何测试呢?

解答: 除了下面选择的答案,这里是另一个问题的参考,解释为什么会发生这种情况

MMX toolbox

1 个答案:

答案 0 :(得分:1)

带有加注的

expect应该包含在一个块中

expect(@school.tags << @tag1).to raise_error(ActiveRecord::RecordInvalid)

应该是

expect{@school.tags << @tag1}.to raise_error(ActiveRecord::RecordInvalid)