Rails 使用参数测试控制器私有方法

Rails testing controller private method with params

我在控制器中有一个私有方法

private 
  def body_builder
    review_queue = ReviewQueueApplication.where(id: params[:review_queue_id]).first
    ...
    ...
  end

我只想测试 body_builder 方法,它是一种为休息客户端 api 调用构建有效负载的方法。但是它需要访问参数。

describe ReviewQueueApplicationsController, type: :controller do
  describe "when calling the post_review action" do
    it "should have the correct payload setup" do
      @review_queue_application = ReviewQueueApplication.create!(application_id: 1)
      params = ActionController::Parameters.new({ review_queue_id: @review_queue_application.id })
      expect(controller.send(:body_builder)).to eq(nil)
    end
  end
end

如果我 运行 上面它会发送 body_builder 方法,但随后它会中断,因为参数没有正确设置,因为它们将在操作调用中设置。

我总是可以为 body_builder 方法创建一个条件参数,这样它要么接受一个参数,要么像这样使用参数 def body_builder(review_queue_id = params[:review_queue_id]) 然后在测试中 controller.send(:body_builder, params) ,但我觉得更改代码使测试通过是错误的,应该按原样进行测试。

如何在将私有方法发送给控制器之前将参数传入控制器?

我想你应该可以替换

params = ActionController::Parameters.new({ review_queue_id: @review_queue_application.id })

controller.params = ActionController::Parameters.new({ review_queue_id: @review_queue_application.id })

你应该很好。 params 只是控制器的一个属性(实际属性是 @_params 但有访问该 ivar 的方法。尝试将 controller.inspect 放在视图中)。