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
放在视图中)。
我在控制器中有一个私有方法
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
放在视图中)。