期望创建一个新对象

Expect the creation of a new object

我需要编写一个期望,即在支付系统中创建一个新对象。 order.rborder_spec.rb 中包含的代码(Order class 是 here):

#order.rb 

def confirm_order(method_of_payment)
  if credit_card_but_products_out_stock?(method_of_payment)
    raise "Cannot make credit card payment now, as some products are out of stock" 
  end

  order_total
  Payment.new(method_of_payment, self.total)
end

#order_spec.rb

it 'it creates a new payment object if method_of_payment is valid and order.total is > 0' do
  order.add_product(product, 3)
  order.confirm_order(:credit_card)
  #Expect that a new payment object is created.
end

我想了解如何编写适当的规范来测试是否创建了新的 Payment 对象。我发现来自 Semaphore CI 的 this article 很有用,但不确定解决方案。我很确定我应该创建某种测试替身,然后可能是 allow(order).to receive(:confirm_order).and_return(#new_object??).

的方法存根

如果您正在对 Order class 进行单元测试,那么您不应该嘲笑或存根 Order class。您可以将 Payment class 的期望设置为 return 模拟,然后您可以进一步断言作为 confirm_order 方法的 return 值。

let(:payment) { double :payment }

it "returns a payment" do
  expect(Payment).to receive(:new).with(:credit_card).and_return(payment)

  order.add_product(product, 3)
  expect(order.confirm_order(:credit_card)).to eq(payment)
end

这样,您就可以在不更改 Order class 的情况下模拟 Order class 的依赖项,这比 [=] 上的模拟方法安全得多11=] 很容易产生假阳性测试结果。