如何在rails中测试rspec shoulda进行自定义验证?

时间:2013-03-27 11:19:53

标签: ruby-on-rails ruby-on-rails-3 rspec rspec-rails shoulda

我的模型中有一个私有方法,如下所示:

  validate :record_uniq

  private
  def record_uniq
    if record_already_exists?
      errors.add(:base, "already exists")
    end
  end

  def record_already_exists?
    question_id = measure.question_id
    self.class.joins(:measure).
    where(measures: {question_id: ques_id}).
    where(package_id: pack_id).
    exists?
  end

此方法更像是uniqueness范围,以防止重复记录。我想知道如何使用validate :record_uniqshouldarspec编写测试?

我尝试过的例子:

describe Foo do
  before do
    @bar = Foo.new(enr_rds_measure_id: 1, enr_rds_package_id: 2)
  end

  subject { @bar }

  it { should validate_uniqueness_of(:record_uniq) }
end

2 个答案:

答案 0 :(得分:9)

简单 - 构建一个未通过验证的对象,验证它,并验证是否已设置正确的错误消息。

例如(如果你有一个名为City的模型):

it 'validates that city is unique' do
  city = City.new # add in stuff to make sure it will trip your validation
  city.valid?
  city.should have(1).error_on(:base) # or 
  city.errors(:base).should eq ["already exists"]
end

答案 1 :(得分:7)

这是我使用RSpec 3语法做的事情。

it 'validates that city is unique' do
  city = City.new('already taken name')
  expect(city).to be_invalid
  expect(city.errors[:base]).to include('already exists')
end