RubyOnRails 类 / 预加载与新

RubyOnRails classes / Preloading vs. new

用例如下:一些外部应用程序发送一个 webhook,rails 应用程序接收。我正在使用自定义 class 将负载重定向到其他地方。

这个习俗 class 几乎总是通过相同的方法做同样的事情。

class代码:

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_paid(data)) 就足够了

我的想法是在启动时预加载 class(例如 RetargetWebhook = Retarget.newconfig/initializers 文件中),因此它可以在任何地方使用;但我想这样做会失败

我不确定你为什么需要一个实例,但为了安全起见,让我们保留它。我建议:

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_paid 将创建实例本身。

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