仅当关联存在时,如何在更新时设置模型验证测试?
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
)上明确创建一个调查,以便验证 运行 正确。
如果模型具有关联,如何设置仅在更新时检查验证的测试?下面是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
)上明确创建一个调查,以便验证 运行 正确。