代码之家  ›  专栏  ›  技术社区  ›  Ben

RubyOnRails类/预加载与新

  •  0
  • Ben  · 技术社区  · 7 年前

    用例如下:一些外部应用程序发送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_paid(data) )就够了

    我的想法是在引导类时预加载(例如。 RetargetWebhook = Retarget.new 在一个 config/initializers 文件),因此可以在任何地方使用;但我想这样做会失败的

    1 回复  |  直到 7 年前
        1
  •  1
  •   apneadiving    7 年前

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

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

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