如何测试RSpec中是否发生带参数的方法调用

时间:2015-04-20 10:02:37

标签: ruby-on-rails ruby rspec

在我的Ruby应用程序中,我试图用RSpec测试一个用控制器参数调用的模块方法。

相关模块是用于跟踪分析的EventTracker模块:https://github.com/doorkeeper/event_tracker

情况就是这样:

  1. 从我的控制器中,我从控制器调用方法,如下所示:

    class InvestorHomeController < ApplicationController
      def do_something
        track_event 'User Action'
      end
    end
    
  2. track_event模块在​​EventTracker模块中定义,如下所示:

    module EventTracker
      module HelperMethods
        def track_event(event_name, args = {})
          (session[:event_tracker_queue] ||= []) << [event_name, args]
      end
    end
    

  3. 我尝试了不同的解决方案,但没有任何方法可以帮助我。像:

    expect(controller).to receive(:track_event).with('User Action')
    expect(EventTracker).to receive(:track_event).with('User Action')
    
  4. 第一个它不起作用,因为track_event不是控制器的方法, 而对于第二个,我有以下错误:

    RSpec::Mocks::MockExpectationError: (EventTracker).track_event("User Action")
    expected: 1 time with arguments: ("User Action")
    received: 0 times
    

    任何人都知道如何用RSpec测试这种方法吗?

    谢谢, d。

1 个答案:

答案 0 :(得分:7)

我资助让它运作的方式!

基本上我正在做一切正确的事情,而不是打电话给&#39; post&#39; 在正确的地方发挥作用。

后调用必须在:

之后完成
  expect(controller).to receive(:track_event).with('User Action')

即。下面的代码可以正常工作:

  expect(controller).to receive(:track_event).with('User Action')
  post :new_user_action_post

而不是之前。

我希望能帮助别人! ;)

d