【问题标题】:Stubbing API calls in controller with rspec使用 rspec 在控制器中存根 API 调用
【发布时间】:2013-07-30 13:06:19
【问题描述】:

我只是有点困惑为什么我不能在我的控制器规范中存根局部变量。

这是我的控制器:

Class UsersController < ApplicationController
    ...
    def get_company
        resp = Net::HTTP.get("http://get_company_from_user_id.com/#{params[:id]}.json")
        @resp = JSON.parse(resp.body)
        ...

我的规格如下:

class ResponseHelper
    def initialize(body)
        @body = body
    end
end

describe "Get company" do
it "returns successful response" do
        stub_resp_body = '{"company": "example"}' 
        stub_resp = ResponseHelper.new(stub_resp_body)
    controller.stub!(:resp).and_return(stub_resp)
    get :get_company, {:id => @test_user.id}
    expect(response.status).to eq(200)
    end
end

我仍然收到一条错误消息:

 Errno::ECONNREFUSED:
 Connection refused - connect(2)

我做错了什么?如果我要存根 resp 变量,为什么它仍在尝试执行 HTTP 请求?在这种情况下我将如何存根 resp 变量?

【问题讨论】:

  • 未回答问题,但字符串插值不适用于单引号字符串。
  • 我建议使用 WebMock github.com/bblimke/webmock 而不是存根 Net::HTTP

标签: ruby rspec stubbing


【解决方案1】:

你不能存根一个局部变量,你只能存根方法。在您的情况下,您可以存根 Net::HTTP.get 方法:

Net::HTTP.stub(:get).and_return(stub_resp)

【讨论】:

  • 解决了!感谢您的快速回复!
【解决方案2】:

没有“存根局部变量”之类的东西。唯一可以存根的就是方法调用。

您将需要Net::HTTP.get 调用的存根来返回类似于Net::HTTPResponse 的内容,您的其余代码可以使用该内容。

我经常喜欢通过为每个 api 设置一个客户端类来整理它,该类知道如何从参数(在本例中为 id)生成 url 以及如何解析响应。这将这些细节排除在控制器之外,也使测试变得容易,因为现在您可以提供一个模拟客户端对象

【讨论】:

    【解决方案3】:

    你不能存根一个局部变量。只是一种方法。由于上面有答案,您可能想要存根 Net::HTTP.get 调用。但是,如果您不想让代码依赖于特定的 HTTP 客户端库,您可以将 http 请求提取到控制器的另一个方法中并存根该方法

    Class UsersController < ApplicationController
    ...
    def get_company
        resp = make_request(params[:id)
        @resp = JSON.parse(resp.body)
    end
    
    protected
    
    def make_request(id)
      Net::HTTP.get('http://get_company_from_user_id.com/#{id}.json')
    end
    
    
    controller.
      should_receive(:make_request).
      with(@test_user.id).
      and_return(stub_resp)
    

    【讨论】:

      猜你喜欢
      • 2021-08-31
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多