目前,如果您有一个被多次调用的方法,并且您想确保发生某个调用,那么您需要编写大量的虚拟代码。
events = []
Analytics.should_receive(:track) do |event|
events << event
end.any_number_of_times
<<INVOKE CONTROLLER ACTION>>
event = events.find{|event| event.event_name == 'MyEventName'}
event.should_not be_nil
event.properties.should include({ property_a: value})
上面的代码需要 1. 记录所有被跟踪的事件 2. 找到某个事件名称的至少一个实例并匹配属性
当应该有更简单的方法时,这会导致很多代码行。
Analytics.should_receive(:track) do |event|
expect(event.event_name).to eq('MyEventName')
expect(event.properties).to include({ property_a: value})
end.at_least(:once)
不幸的是,只有在第一次调用 Analytics.track 导致匹配时,上述方法才有效。如果是第二次调用,此测试将失败。
我有自己的解决方案来尝试使其通用和可重用,但我想知道是否有一种简单的方法可以实现这一点,我可能会错过。