我有一个模型Trip,它为' refund_policy'设置默认值。退款' refund_policy'这次旅行的公司。公司本身具有默认值,即“退款政策”和“退款政策”。 ID为4的公司政策。
我对Trip的有效工厂的测试失败了,因为许多其他人都没有,因为数据库中没有ID为4的公司。我曾尝试使用显式ID设置公司。此外,我试图扣留这家公司或其退款政策尚未奏效。
根据先前的测试确定,所有使用的工厂都是有效的。
我试过了:
#trip_spec.rb
describe Trip do
let(:company) { FactoryGirl.build(:company) }
let(:refund_policy) { 'example refund policy' }
before do
company.stub(:refund_policy).and_return(refund_policy)
Company.stub(:find).and_return(company)
end
it "has a valid factory" do
expect( FactoryGirl.build :trip, company_id: company.id ).to be_valid
end
end
我也尝试过:
let(:company) { FactoryGirl.build(:company, id: 4) }
it "has a valid factory" do
expect( FactoryGirl.build :trip ).to be_valid
end
以及:
let!(:company) { FactoryGirl.create(:company, id: 4) }
it "has a valid factory" do
expect( FactoryGirl.build :trip ).to be_valid
end
所有这些都会导致错误消息
# gives this error
Trip has a valid factory
Failure/Error: let(:company) { FactoryGirl.build(:company) }
ActiveRecord::RecordNotFound:
Couldn't find Company with id=4
# ./app/models/company.rb:70:in `default_refund_policy'
# ./app/models/company.rb:66:in `set_defaults'
# ./spec/models/trip_spec.rb:5:in `block (2 levels) in <top (required)>'
行程退款_policy
的默认值#trip.rb
def set_defaults
self.refund_policy = company.refund_policy if company && (refund_policy.blank? || (refund_policy && refund_policy.strip.length == 0))
end
公司的默认值refund_policy
#company.rb
def set_defaults
self.refund_policy = default_refund_policy if refund_policy.blank? || (refund_policy && refund_policy.strip.length == 0)
end
def default_refund_policy
Company.find(4).refund_policy
end
如何有效地解释此默认值路径?
提前致谢。
答案 0 :(得分:1)
这三个都失败了,因为set_defaults
被调用作为构建过程的一部分,而过程调用default_return_policy
来调用find
。使用生产代码,在尝试创建公司之前,您需要存根Company.find
。
另外:
build
而不是create
let
而不是let!
而未在示例中引用该变量。以下情况至少应该让你离得更近了:
describe Trip do
before do
company = InstanceDouble(Company, refund_policy: 'example refund policy')
Company.stub(:find).and_return(company)
end
it "has a valid factory" do
expect( FactoryGirl.build :trip, company_id: company.id ).to be_valid
end
end