仅当关联存在时,如何在更新时设置模型验证测试?

How do I set up a model validation test on update only if association exists?

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

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

以上测试失败,returns 正确。查看控制台后,我可以看到测试失败,因为没有针对我的用户的调查,所以验证不是 运行。

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

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

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

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