【问题标题】:How do I set up a model validation test on update only if association exists?仅当存在关联时,如何在更新时设置模型验证测试?
【发布时间】:2015-03-09 17:29:35
【问题描述】:

如果模型具有关联,如何设置仅在更新时检查验证的测试?以下是 2 个类和测试。

user.rb
class User < ActiveRecord::Base
    has_one :survey
    validates :first_name, presence: true, on: :update, if: :survey_completed?

    private
    def survey_completed?
        survey.present?
    end
end

survey.rb
class Survey < ActiveRecord::Base
    belongs_to :user
    validates :user, presence: true
end


user_spec.rb
describe "if survey is completed" do
  let(:user) {User.create(email: 'test@test.com')}
  let(:survey) {Survey.create(user_id: user.id)}

  it "returns error if phone number has not been completed" do   
    user.first_name = 'test'
    expect(user.reload.valid?).to be false
  end
end

上述测试失败,返回true。查看控制台后,我可以看到测试失败,因为没有针对我的用户的调查,因此没有运行验证。

我尝试了save! 的变体,使用重新加载,而不是重新加载,测试总是返回真。如何设置测试以便有与用户相关的调查?

为简单起见,我只展示了相关代码。

【问题讨论】:

    标签: ruby-on-rails validation ruby-on-rails-4.1 updatemodel


    【解决方案1】:

    在 rspec 中 let 是懒惰的。在您在代码中使用该变量之前,不会对其进行评估。由于您的测试中没有survey,因此let(:survey) {Survey.create(user_id: user.id)} 行永远不会运行。

    对于这个测试,我会明确地在user(即user.survey.create)上创建一个调查,以便验证能够正常运行。

    【讨论】:

    • 当然,谢谢!我使用了一个前块,例如before(:each) Survey.create(user_id: @user.id)。我会赞成你的回答,但我没有足够的分数:(
    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    相关资源
    最近更新 更多