繁体   English   中英

RSpec存根服务对象方法

[英]RSpec Stubbing Service Object Method

我遇到了从AR对象中断对服务对象(QuickbooksService)的调用的问题。 据我所知,该方法应该正确地存根并返回我指定的值,但是当我运行规范时,我可以看到该方法被调用并失败了。

这是我正在测试的对象的类定义。

class Order < ActiveRecord::Base
  def create_invoice
    QuickbooksService.new(:estimate).create_invoice(arg1, arg2, arg3)
  end
end

并从order_spec

describe("#create_invoice") do
  expect(QuickbooksService.new(:estimate)).to receive(:create_invoice).and_return(1)
end

我也尝试过

allow(QuickbooksService.new(:estimate)).to receive(:form_invoice_create).with(anything()).and_return(1)

因此,而不是返回1 ,而是在QuickbooksService内部执行create_invoice方法。 任何见识将不胜感激!

您遇到的问题是您正在存根单独的实例。 即,当您定义期望时,您告诉它期望特定实例接收到对该方法的调用,但是当执行代码时,它正在创建另一个实例。 您需要做的是允许任何实例接收方法调用。 诸如allow_any_instance_of(QuickbooksService).to receive(:invoice_create)可以工作,但是创建一个double更好的做法是,例如:

let(:quickbooks_service) { instance_double(QuickbooksService) }

describe("#create_invoice") do
  before { allow(quickbooks_service).to receive(:create_invoice).and_return(1) }

  it "Creates quickbook invoice" do
    order.create_invoice
    expect(quickbooks_service).to have_received(:create_invoice)
  end
end

请参阅: https//relishapp.com/rspec/rspec-mocks/docs

问题在于您正在实例化该类,同时将其allow(QuickbooksService.new(:estimate)).to receive(:form_invoice_create).with(anything()).and_return(1)

尝试这个:

allow_any_instance_of(QuickbooksService).to receive(:form_invoice_create).with(anything()).and_return(1)

在学习rspec模拟和存根时发现了这一点。 在Nicholas.V的答案1上 ,我们也不需要做

QuickbooksService.stub(:new).and_return(quickbooks_service)

在调用order.create_invoice之前?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM