コンテキスト
我々は、レール3.2.12から4.0.2に移行するとRubyは2.1.8に1.9.3。レール3~4移行一意性検証の問題
RSpecの形式で移行を実行するために、多くのテストカバレッジがあります。
発行カードのモデルに一意性の検証が失敗していることを確認スペックの
一つ。 program_member
は一つだけmobile: true
カードを持っているかもしれ
validates :mobile, uniqueness: {scope: :program_member_id, message: I18n.t('models.card.error.cardholder_already_has_mobile')}, if: :mobile
。
仕様では、メンバー用に2枚のカードが作成され、1枚がモバイルカードになり、2枚目のカードで検証するとメッセージが表示されます。
let(:program) { FactoryGirl.create(:program) }
let(:card) { FactoryGirl.create(:card, program: program) }
context 'when cardholder already has a mobile card' do
it 'fails validation' do
card2 = FactoryGirl.create(:card, program: program)
program_member_user = FactoryGirl.create(:program_member_user, card_number: card2.cardnumber)
program_member = program_member_user.program_members.first
program_member.cards << card2
card2.update_attributes(:mobile => true)
program_member.cards << card
card.update_attributes(:mobile => true)
expect(card.errors.messages).to include(:mobile=>[I18n.t('models.card.error.cardholder_already_has_mobile')])
end
end
期待:
expected {} to include {:mobile=>["Cardholder already has a mobile card"]}
私たちのmaster
支店に行き、この仕様は合格します。
この仕様から機能しなくなった唯一の要因は、Rails 3から4への移行です。
コンソールでスペックコードを実行してみると、メンバーにモバイルカードが2つあり、card.valid?
を実行すると、両方のインスタンスでtrue
が返されます。
質問
は何がユニークさの検証または検証のライフサイクルに関してでのRails 4に変わりましたか?
「register_card」は完全性のために何を共有してもよろしいですか? –
@JanKlimo私はprogram_member_userにカードを割り当てるために実行されている実際のコードを反映するために質問を更新しました。私がコンソールで手動ですべてを追加しても、私はまだ動作検証を得ることができません。検証の条件を削除しても効果はありません(すなわち、非モバイルカードの一意性の検証を行う)。 – fbelanger
あなたのコードに何の問題も見られないので、非常に奇妙です。私は問題の単純化されたバージョンでテストのレポを作成しましたが、同一の検証が行われました。クローンしてrspecを実行すると、テストは合格しますか? https://github.com/janklimo/TestUniquenessApp –