Ruby on rails 用rspec测试在另一个方法中调用了该方法

Ruby on rails 用rspec测试在另一个方法中调用了该方法,ruby-on-rails,ruby,testing,rspec,rspec-rails,Ruby On Rails,Ruby,Testing,Rspec,Rspec Rails,我必须为以下方法编写规范: def track_event tracker = set_tracker category = define_event_category tracker.event(category: category, action: name, label: properties['short_name'], value: properties['paid']) end 具体来说,当调用track\u event时,我必须检查变量tracker上是否调用了方法e

我必须为以下方法编写规范:

def track_event
  tracker = set_tracker
  category = define_event_category
  tracker.event(category: category, action: name, label: properties['short_name'], value: properties['paid'])
end
具体来说,当调用
track\u event
时,我必须检查变量
tracker
上是否调用了方法
event
。我试着这样做:

describe '#track_event' do
  it 'should call event method' do
    expect(tracker).to receive(:event)
  end
end

并得到一个错误
未定义的局部变量或方法“跟踪器”
。我做错了什么?

您无法访问跟踪程序,因为它是一个局部变量

您可以将
set\u tracker
方法存根,然后返回:


foo
是您的测试主题。

假设在您的RSpec中,
subject
是定义了
track\u event
方法的类的实例,您可以将从
set\u tracker
返回的值存根到您定义的对象,然后检查是否对该
tracker
对象调用了方法
event

 describe '#track_event' do
   # Build a tracker object
   let(:tracker) { <Whatever type of object you expect as a tracker> }

   # Stub the output of `set_tracker`
   before { allow(subject).to receive(:set_tracker) { tracker } }

   it 'should call event method' do
     expect(tracker).to receive(:event)
   end

   after { subject.track_event }
 end
描述#跟踪事件"做什么
#构建一个跟踪器对象
let(:tracker){}
#Stub“set_tracker”的输出`
在{allow(subject.)之前接收(:set_tracker){tracker}
它“应该调用事件方法”做什么
期望(跟踪器)。接收(:事件)
结束
在{subject.track_event}之后
结束

我建议也使用方法调用来验证参数。

是的,因为在调用它之前没有定义
tracker
 describe '#track_event' do
   # Build a tracker object
   let(:tracker) { <Whatever type of object you expect as a tracker> }

   # Stub the output of `set_tracker`
   before { allow(subject).to receive(:set_tracker) { tracker } }

   it 'should call event method' do
     expect(tracker).to receive(:event)
   end

   after { subject.track_event }
 end