【问题标题】:Simple Spec That Validates_AssociatedValidates_Associated 的简单规范
【发布时间】:2015-09-04 17:03:42
【问题描述】:

我正在尝试在我的 Campaign 模型上测试验证。我有一个允许用户Create a Campaign 的表单,这应该要求他们在保存之前选择program

我尝试在 SO 上遵循一些答案,但无法让它们发挥作用。这是我到目前为止所拥有的......

关系..

class Campaign < ActiveRecord::Base
    belongs_to :program
    validates_associated :program, 
        message: "You need to choose a Program."
end

class Program < ActiveRecord::Base
    has_many :campaigns
end

..和规范。

it 'validates associated campaign' do
  campaign = build(:campaign)
  expect(campaign.save).to be false
  expect(campaign.errors).to eq "You need to choose a Program."
end

失败..

Failures:

  1) Campaign validates associated campaign
     Failure/Error: expect(campaign.save).to be false

       expected false
            got true
     # ./spec/models/campaign_spec.rb:34:in `block (2 levels) in <top (required)>'

【问题讨论】:

  • 你没有注释掉validates_associated吗?
  • 我在尝试时打开和关闭它。没有意识到它仍然在我的粘贴中被注释掉。我会解决的。

标签: ruby-on-rails ruby rspec tdd bdd


【解决方案1】:

由于没有内置的 validates_associated 匹配器,我写了这个:

it { is_expected.not_to validate_presence_of(:program) }

context 'when program is present' do
  let(:program) { FactoryBot.create(:program) }
  before { subject.program = program }
  it { is_expected.to be_valid }

  context 'when program is present but not valid' do
    before { program.owner = nil }
    it { is_expected.not_to be_valid }
  end
end

这一行:before { program.owner = nil } 需要一些程序验证的知识。从Campaign 的单元测试的上下文来看,这并不理想,但不是我犯过的最糟糕的编程罪。

【讨论】:

    【解决方案2】:

    validates_associated 仅在存在关联对象时有效。在您的示例规范中,活动工厂(我假设)没有添加关联程序,因此不执行验证,并且活动被保存。

    您要查找的是validates :program, presence: true,如果缺少该程序,valid? 将返回 false。

    Rails Guide for ActiveRecord Validations 中查看更多信息。

    【讨论】:

    • 谢谢。我相信这会奏效,但我在 FactoryGirl::InvalidFactoryError 遇到了一个关于建立关联的新问题,所以我还不能说。我将把这个问题写成一个新的帖子,然后回到这个..
    猜你喜欢
    • 1970-01-01
    • 2011-03-03
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    相关资源
    最近更新 更多