期望创建一个新对象
Expect the creation of a new object
我需要编写一个期望,即在支付系统中创建一个新对象。 order.rb
和 order_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=] 很容易产生假阳性测试结果。
我需要编写一个期望,即在支付系统中创建一个新对象。 order.rb
和 order_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=] 很容易产生假阳性测试结果。