RSpecカスタムマッチャでデータベースの外部キー制約をテストする
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制約カスタムマッチャでした。