上下文
我们正在从Rails 3.2.12迁移到4.0.2和Ruby 1.9.3到2.1.8。Rails 3到4迁移唯一性验证问题
我们有很多测试覆盖率来完成RSpec形式的迁移。
问题
一说检查是在卡模型验证的唯一失败的规范的。
validates :mobile, uniqueness: {scope: :program_member_id, message: I18n.t('models.card.error.cardholder_already_has_mobile')}, if: :mobile
凡program_member
可能只有一个mobile: true
卡。
该规范会为会员创建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的迁移。
尝试在控制台中运行规范代码才发现该成员有两个移动卡,并且对两个实例都做了card.valid?
返回true
。
问题
有没有什么Rails中4改变了问候的唯一性验证或验证生命周期?
你介意分享一下'register_card'的完整性吗? –
@JanKlimo我已经更新了这个问题,以反映将卡片分配给program_member_user的实际代码。即使我在控制台手动添加所有内容,仍然无法使验证生效。即使删除验证条件也没有效果(即,对非移动卡的唯一性进行验证)。 – fbelanger
嗯,很奇怪,因为我没有看到你的代码有任何问题。我使用问题的简化版本创建了一个测试回购,但验证完全相同。如果你克隆它并运行rspec,测试通过了吗? https://github.com/janklimo/TestUniquenessApp –