我有一个控制器,其POST操作名为create。在创建操作中,我使用puntopagos gem类(PuntoPagos::Request),该类使用rest-client gem对API进行POST:

class SomeController < ApplicationController

  def create
    request = PuntoPagos::Request.new
    response = request.create
    #request.create method (another method deeper, really)
    #does the POST to the API using rest-client gem.

    if response.success?
      #do something on success
    else
      #do something on error
    end
  end

end


如何使用RSpec存根rest-client请求和响应以测试我的create动作?

最佳答案

只需存根PuntoPagos::Request.new并继续存根:

response = double 'response'
response.stub(:success?) { true }
request = double 'request'
request.stub(:create) { response }
PuntoPagos::Request.stub(:new) { request }


这是一个成功的请求;再次执行success?并返回false以测试该分支。

完成该工作后,请查看stub_chain以更少的输入执行相同的操作。

话虽如此,将PuntoPagos内容提取到具有更简单接口的单独类中会更好:

class PuntoPagosService
  def self.make_request
    request = PuntoPagos::Request.new
    response = request.create
    response.success?
  end
end


那你就可以做

PuntoPagosService.stub(:make_request) { true }


在您的测试中。

09-10 14:31