我有型号名称:UserApplicationPatient。该模型具有两个关联:
belongs_to :patient
belongs_to :customer
before_create :set_defaults
private
def set_defaults
self.enrol_date_and_time = Time.now.utc
self.pap = '1'
self.flg = '1'
self.patient_num = "hos_#{patient_id}"
end
用户应用程序工厂患者
FactoryBot.define do
factory :user_application_patient do
association :patient
association :customer
before(:create) do |user_application_patient, evaluator|
FactoryBot.create(:patient)
FactoryBot.create(:customer)
end
end
end
型号规格:
require 'spec_helper'
describe UserApplicationPatient do
describe "required attributes" do
let!(:user_application_patient) { described_class.create }
it "return an error with all required attributes" do
expect(user_application_patient.errors.messages).to eq(
{ patient: ["must exist"],
customer: ["must exist"]
},
)
end
end
end
这是我第一次写模型的规格说明,谁能告诉我如何写set_defaults before_create方法和工厂的规格说明,我写的是对是错。
2条答案
按热度按时间bpzcxfmw1#
由于您是在before_create钩子中设置默认值,因此我建议这样验证它
ubof19bj2#
要测试是否设置了默认值,请创建一个用户并测试是否设置了默认值。
let!
,除非需要,否则不需要创建对象。create
,所以这里根本没有使用let
。patient_id
应该是patient.id
。这是第一关。
这些可能会失败。
patient_id
?我们可以将设置默认值改为before validation,这样对象就可以通过验证,而且我们还可以在将对象写入数据库之前查看对象的属性。
我们可以修改set_defaults,使其不会覆盖现有属性。
不应该使用
Time.now
,它不知道时区。UseTime.current
。并且没有理由传入UTC,数据库将存储UTC的时间,Rails将为您转换。我们还可以让您的工厂更灵活一些。
这样,无论您是
build(:user_application_patient)
还是create(:user_application_patient)
,都会创建患者和客户。这对于user_application_patient能够引用其patient.id是必要的。一般来说,不要在创建时做任何事情。