Techioz Blog

ショルダーマッチャーの件名を変更する方法

概要

クラス内の次の属性で問題が発生しています。データベースレベルでも強制される、プレゼンスが true の日付属性があります。

検証:日付、存在: true

それに加えて、次の 2 つの属性の組み合わせの一意性を強制する必要があります。

validates :name, uniqueness: { scope: :parent_id }

これまでのところ…すべて問題ありませんが、一意性をテストする仕様が必要です

それは { validate_uniqueness_of(:name).scoped_to(:parent_id) する必要があります }

しかし、上記の行の問題は、ランダムな名前とparent_id値を使用して、日付をnilにしてデータベースにレコードを挿入しようとすることです。したがって、データベースで失敗します。

すでにテストで subject { build(:my_model) } を実行しようとしましたが、その行はまだ独自の行を作成しており、日付属性を設定していません。

作成した主題を使用するにはどうすればよいですか?何かが足りないのですか?

解決策

Shoulda マッチャーは、データベース内に別のレコードを作成して、一意でない場合をテストする必要があります。これを行うために Rails の検証はスキップされますが、データベースの検証をスキップすることはできません。手動で作成した場合は、代わりにそれが使用されます。テストを次のように変更します。

subject { FactoryGirl.build(:my_model) }
it { should validate_uniqueness_of(:name).scoped_to(:parent_id) }

これについては、肩マッチャーのドキュメントで詳しく説明されています。 https://translate.google.com/translate?hl=ja&sl=en&tl=ja&u=https://www.rubydoc.info/gems/shoulda-matchers/Shoulda%2FMatchers%2FActiveRecord:validate_uniqueness_of