RSpec / Ruby / Rails

連載: Rails4のActiveRecord向けRSpecカスタムマッチャ5選

前々回のNOT NULL制約カスタムマッチャの記事前回のUNIQUE制約カスタムマッチャの記事でDBの制約テストを簡単にしてきましたが、DB制約のRSpecカスタムマッチャも作りました。

例えば

describe Person do
  subject { FactoryGirl.create(:person) }
  it { should have_foreign_key_constraint_on(:school_id) }
end

と書くと

$ bundle exec rspec spec/models/person_spec.rb
Person
  should have FOREIGN KEY constraint on school_id

とテストできるようになります。

カスタムマッチャは

RSpec::Matchers.define :have_foreign_key_constraint_on do |field|
  match do |model|
    model.send("#{field}=", 0)
    begin
      model.save!(validate: false)
      false
    rescue ActiveRecord::InvalidForeignKey
      true
    end
  end

  description { "have FOREIGN KEY constraint on #{field}" }
  failure_message { "expected to have FOREIGN KEY constraint on #{field}, but not" }
end

となります。

以上、NOT NULL制約カスタムマッチャ, UNIQUE制約カスタムマッチャと一緒に使えるDB制約カスタムマッチャでした。

関連記事