【问题标题】:test that method was called inside another method with rspec使用 rspec 在另一个方法中测试该方法是否被调用
【发布时间】:2018-04-25 12:40:32
【问题描述】:

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

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_event 时,我必须检查是否在变量tracker 上调用了方法event。我试着这样做:

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

并收到错误undefined local variable or method 'tracker'。我做错了什么?

【问题讨论】:

  • 是的,因为你在调用它之前没有定义tracker

标签: ruby-on-rails ruby testing rspec rspec-rails


【解决方案1】:

您无法访问tracker,因为它是一个局部变量。

您可以改为存根您的set_tracker 方法并返回instance double

describe '#track_event' do
  let(:tracker_double) { instance_double(Tracker) }

  it 'should call event method' do
    allow(foo).to receive(:set_tracker).and_return(tracker_double)
    expect(tracker_double).to receive(:event)
    foo.track_event
  end
end

foo 是你的测试对象。

【讨论】:

    【解决方案2】:

    假设在您的 rspecs 中,subject 是定义 track_event 方法的类的实例,您可以将 set_tracker 返回的值存根到您定义的对象,然后检查方法 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
    

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

    【讨论】:

      猜你喜欢
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      • 2014-04-18
      相关资源
      最近更新 更多