加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 期待创建一个新对象

发布时间:2020-12-16 19:21:13 所属栏目:百科 来源:网络整理
导读:我需要写一个期望,即在支付系统中创建一个新对象. order.rb和order_spec.rb包含的代码(订单类为 here): #order.rb def confirm_order(method_of_payment) if credit_card_but_products_out_stock?(method_of_payment) raise "Cannot make credit card payme
我需要写一个期望,即在支付系统中创建一个新对象. order.rb和order_spec.rb包含的代码(订单类为 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很有用,但我不确定解决方案.我很确定我应该创建某种类型的测试双,然后可能是方法存根允许(order).to receive(:confirm_order).and_return(#new_object ??).

解决方法

如果您正在对Order类进行单元测试,那么您不应该模拟或存根Order类.您可以在Payment类上设置一个期望值来返回一个模拟,然后您可以进一步断言为confirm_order方法的返回值.
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类的依赖关系,而无需更改Order类,这样更安全,因为Order上的模拟方法可以轻松创建误报测试结果.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读