Rspec - 具有特定ID的记录帐户

时间:2014-07-06 03:45:50

标签: ruby-on-rails ruby rspec

我有一个模型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

如何有效地解释此默认值路径?

提前致谢。

1 个答案:

答案 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