2017-02-10 7 views
8

コンテキスト

我々は、レール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に変わりましたか?

+0

「register_card」は完全性のために何を共有してもよろしいですか? –

+0

@JanKlimo私はprogram_member_userにカードを割り当てるために実行されている実際のコードを反映するために質問を更新しました。私がコンソールで手動ですべてを追加しても、私はまだ動作検証を得ることができません。検証の条件を削除しても効果はありません(すなわち、非モバイルカードの一意性の検証を行う)。 – fbelanger

+0

あなたのコードに何の問題も見られないので、非常に奇妙です。私は問題の単純化されたバージョンでテストのレポを作成しましたが、同一の検証が行われました。クローンしてrspecを実行すると、テストは合格しますか? https://github.com/janklimo/TestUniquenessApp –

答えて

1

だから私は何かに出ている。

同じRuby and Railsバージョンを使用してテストプロジェクトを作成しました。

https://github.com/frank184/test_uniquness

は、このプロジェクトでは、私は同様の検証とbooleanとして admin列を持つ Userモデルを持っているでしょう。

validates_uniqueness_of :admin, if: :admin? 

私はshoulda-matchersとrspecを使って目的の結果を説明しました。

require 'rails_helper' 

RSpec.describe User, type: :model do 
    let(:user) { build :user } 
    subject { user } 

    describe 'validations' do 
    context 'when admin = true' do 
     before(:each) { user.admin = true } 
     it { is_expected.to validate_uniqueness_of(:admin) } 
    end 
    end 
end 

スペックは以下の出力で失敗しました:私はコードが良かったと判断し、正確に4.1.0へのレールをぶつけ

Failures: 

    1) User validations when admin = true should validate that :admin is case-sensitively unique 
    Failure/Error: it { is_expected.to validate_uniqueness_of(:admin) } 

     User did not properly validate that :admin is case-sensitively unique. 
     After taking the given User, whose :admin is ‹true›, and saving it as 
     the existing record, then making a new User and setting its :admin to 
     ‹true› as well, the matcher expected the new User to be invalid, but 
     it was valid instead. 
    # ./spec/models/user_spec.rb:10:in `block (4 levels) in <top (required)>' 

Finished in 0.11435 seconds (files took 0.79997 seconds to load) 
1 example, 1 failure 

仕様が合格!

bundle update 
rspec 
. 

Finished in 0.09538 seconds (files took 1.28 seconds to load) 
1 example, 0 failures 
+0

'is_expected'が' subject'で動くように、あなたのスペックの中の 'user'を' subject'で置き換えて、まだ動作しているかどうか確認してください。 –

+0

'記述 'の上に' do'バリデーションを見てください。 – fbelanger

+0

あなたはうまくやっています。解決策を回答に追加し、それを受け入れて他の人に役立てます。 :) –