0

我有 2 个示例,但我觉得其中的大部分代码是相同的。然而,它们有点不同(记录略有不同,第二个中也有一个额外的断言)。我仍然是测试的初学者,所以在我前进的过程中只是寻找一些技巧。我正在测试一个 rake 任务。这是我的代码:

it 'leaves one billing info for each order' do
  order = FactoryGirl.create(:order)
  FactoryGirl.create_list(:billing_info, 2, order_id: order.id)

  expect(BillingInfo.all.count).to eq(2)

  run_rake_task

  expect(BillingInfo.all.count).to eq(1)
end

it 'keeps the billing info with trevance information' do
  order = FactoryGirl.create(:order)
  FactoryGirl.create(:billing_info, order_id: order.id, complete_trevance_message: nil, trevance_attempts: nil)
  FactoryGirl.create(:billing_info, order_id: order.id, complete_trevance_message: "303 -- Processor Decline", trevance_attempts: 1)

  expect(BillingInfo.all.count).to eq(2)

  run_rake_task

  expect(BillingInfo.all.count).to eq(1)
  expect(BillingInfo.first.complete_trevance_message).to eq("303 -- Processor Decline")
end

如您所见,它们非常相似。像这样将它们分成两部分可以吗?或者,还有更好的方法?

4

2 回答 2

1

在我看来,DRY 并不总是测试中的最佳规则。这通常意味着您必须在方法中隐藏一些代码,因此这更难阅读等。所以我不会改变太多,但有些事情可以用更简单的方式完成。

context "billing rake task"
  let(:order) { FactoryGirl.create(:order) }

  it 'leaves one billing info for each order' do
    FactoryGirl.create_list(:billing_info, 2, order_id: order.id)
    expect { run_rake_task }.to change { BillingInfo.count }.by(-1)
  end

  it 'keeps the billing info with trevance information' do
    FactoryGirl.create(:billing_info, order_id: order.id, complete_trevance_message: nil, trevance_attempts: nil)
    FactoryGirl.create(:billing_info, order_id: order.id, complete_trevance_message: "303 -- Processor Decline", trevance_attempts: 1)

    expect { run_rake_task }.to change { BillingInfo.count }.by(-1)
    expect(BillingInfo.first.complete_trevance_message).to eq("303 -- Processor Decline")
  end
end

请注意,这会稍微改变规范,因此您无需检查 count 是否从正好 2 变为正好 1,而是减少了 1。我认为这里更好,但我不能确定,因为我不太了解您的应用程序。

于 2013-07-23T21:21:19.353 回答
0

我会重构为这样的:

let(:order) { FactoryGirl.create(:order) }

describe "description here" do

  before do
    FactoryGirl.create_list(:billing_info, 2, order_id: order.id)  
  end

  it 'leaves one billing info for each order' do
    expect(BillingInfo.all.count).to eq(2)

    run_rake_task  

    expect(BillingInfo.all.count).to eq(1)
  end

end

describe "description here" do

  before do
    FactoryGirl.create(:billing_info, order_id: order.id, complete_trevance_message: nil, trevance_attempts: nil)
    FactoryGirl.create(:billing_info, order_id: order.id, complete_trevance_message: "303 -- Processor Decline", trevance_attempts: 1)
  end

  it 'keeps the billing info with trevance information' do
    expect(BillingInfo.all.count).to eq(2)

    run_rake_task

    expect(BillingInfo.all.count).to eq(1)
    expect(BillingInfo.first.complete_trevance_message).to eq("303 -- Processor Decline")
  end

end

钩子将before在您的需要中为您提供更多的灵活性。

于 2013-07-23T22:18:28.913 回答