这听起来像是一个非常基本的问题...所以让我解释一下上下文。我正在从Stripe检索一个事件,但出于此目的,但这对于我考虑过的其他事情也起作用。
我在Stripe对象中需要的数据被深埋,所以我必须这样做event.data.object.date.lines.first.id
。我不确定如何模拟/存根...
我能想到的唯一方法是创建一个模拟Stripe事件对象的假模型(在本例中,请记住,Stripe事件不能由用户创建)。然后我可以模拟那个假模型。但这真的是这样做的方法吗?我是否可以使用某种方式仅使用Rspec对整个shebang进行存根处理,并说event.data.object.date.lines.first.id
无论出现在什么地方都应该重新调整1
?
哦,还有...如果没有,事实证明我确实必须创建一个假模型...备受赞赏的技巧,因为现在我正在考虑这种“假”模型需要多层子对象,并且完全不需要值得花时间投资。
RSpec没有提供特殊的机制来访问被测元素,因此,是的,您将需要以某种方式stub
使该id
方法返回所需的任何内容(例如1
)。
为此,您必须有一种方法可以访问event
测试中的对象,以便可以对它的data
方法进行存根。一旦可以访问它,就可以使用RSpec的receive_message_chain
匹配器指定要返回的方法的顺序(如果调用)1
。
如果有一些公共Strip
方法,您可以嘲笑以返回double
for事件,这将是最直接的方法。
如果无法实现,则可以确定的类,event
然后使用allow_any_instance_of
方法对它的data
方法进行存根。假设您是您关注Foo
的event
对象的类,则生成的模拟如下:
allow_any_instance_of(Foo)).to receive_message_chain(
:data, :object, :date, :lines, :first, :id).and_return(1)
这是通过的测试:
module Stripe
class Event ; end
end
describe 'stack overflox example' do
it 'should pass' do
event = Stripe::Event.new
expect(event).to receive_message_chain(:data, :object, :date, :lines, :first, :id).and_return(23)
expect(event.data.object.date.lines.first.id).to eq(23)
end
end
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句