首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rspec -具有特定ID的记录帐户

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

Stack Overflow用户
提问于 2014-07-06 03:45:50
回答 1查看 1.2K关注 0票数 0

我有一个模型,Trip,它将“refund_policy”的默认值设置为该旅行公司的“refund_policy”。公司本身有一个默认值,因为它是ID为4的公司政策的“refund_policy”。

我对一个有效的Trip工厂的测试失败了,许多其他的测试也失败了,因为数据库中没有ID为4的公司。我试图设置一个有明确ID的公司。而且,我试图对该公司或其退款政策进行存根的尝试还没有奏效。

根据先前的测试,所有使用的工厂都是有效的。

我试过:

代码语言:javascript
复制
#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

我也尝试过:

代码语言:javascript
复制
let(:company)       { FactoryGirl.build(:company, id: 4) }

it "has a valid factory" do
  expect( FactoryGirl.build :trip ).to be_valid
end

以及:

代码语言:javascript
复制
let!(:company)       { FactoryGirl.create(:company, id: 4) }

it "has a valid factory" do
    expect( FactoryGirl.build :trip ).to be_valid
end

所有结果都会导致此错误消息

代码语言:javascript
复制
# 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)>'

trip refund_policy的refund_policy默认值

代码语言:javascript
复制
#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的默认值

代码语言:javascript
复制
#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

如何有效地解释这一缺省值路径?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-06 14:44:08

这三种方法都失败了,因为set_defaults作为构建过程的一部分被调用,后者依次调用default_return_policy,后者依次调用find。按照原样使用生产代码,您需要在尝试创建公司之前对Company.find进行存根。

此外:

  • 第二个示例不起作用,因为您使用的是build而不是create
  • 您的第三个示例将无法工作,因为您使用的是let而不是let!,并且没有引用示例中的变量。

以下几点至少可以让你更接近你:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24592532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档