Ruby on rails RubyOnRails类/预加载与新版本

Ruby on rails RubyOnRails类/预加载与新版本,ruby-on-rails,rspec-rails,Ruby On Rails,Rspec Rails,用例如下:一些外部应用程序发送webhook,rails应用程序接收webhook。我正在使用自定义类将负载重定目标到其他位置 这个自定义类几乎总是通过相同的方法执行相同的操作 类别代码: class Retarget def order_paid(params) # do some processing end end 在控制器中这样使用: def process_webhook insert = Retarget.new data = params.except(:

用例如下:一些外部应用程序发送webhook,rails应用程序接收webhook。我正在使用自定义类将负载重定目标到其他位置

这个自定义类几乎总是通过相同的方法执行相同的操作

类别代码:

class Retarget
  def order_paid(params)
    # do some processing
  end
end
在控制器中这样使用:

def process_webhook
  insert = Retarget.new
  data = params.except(:action, :controller)
  insert.order_paid(data)
  head :ok
end
我的问题如下,如果我想验证该方法是否在请求规范中被调用,它显然会失败。下面是一些代码:

it 'triggers' do
  ... some call that fire the controller action
  expect(Retarget).to receive(:order_paid).with(..matching data)
end
在测试控制器请求时,反复检查是否调用了该方法对我来说是一种安全检查

我想知道它是否能以某种方式实现。或者,如果需要单独测试,那么就可以假设控制器insert.order\u paiddata中的行存在就足够了


我的想法是在引导时预加载config/initializers文件中的类,例如RetargetWebhook=Retarget.new,这样它就可以在任何地方使用;但是我想这样做会导致失败,我不知道你为什么需要一个实例,但是为了安全起见,让我们保留它。我建议:

class Retarget  
  def self.order_paid(params)
    new.order_paid(params)
  end

  def order_paid(params)
    # do some processing
  end
end
并使用它:

Retarget.order_paid(params.except(:action, :controller))
这样,Retarget.order将创建实例本身


其他选项可能会导致使用singleton,但我会远离它,因为它没有多少附加值,如果依赖实例变量并开始记忆,它可能会导致混乱。

我的主要目标是能够实际使用单个实例或类似的方法,我可以在任何地方使用,然后可以按图所示对其进行测试。这就是你在最后一段中不推荐的?很抱歉提出这些问题,我必须进一步深入研究类/模块等。对于任何点,我都不会使用单个实例,因为如果你开始像在任何普通对象中那样记忆东西,它可能会引入一些奇怪的错误。我不确定附加值是多少,也许你只是不需要一个实例,可以像类方法一样处理所有事情?这是什么就像同一个控制器中的私有类方法一样?嗯…我想只有尝试这两种方法才能知道:。太多了!