RubyOnRails类/ Preloading与new

时间:2018-02-21 11:08:40

标签: 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(: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 个答案:

答案 0 :(得分:1)

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

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将自己创建实例。

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