3

コントローラーの仕様でローカル変数をスタブできない理由について、少し混乱しています。

これが私のコントローラーです:

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ですか? この場合、どのように変数をスタブしますか?

4

3 に答える 3

6

ローカル変数をスタブすることはできません。スタブできるのはメソッドのみです。あなたの場合、Net::HTTP.getメソッドをスタブできます:

Net::HTTP.stub(:get).and_return(stub_resp)
于 2013-07-30T11:50:28.857 に答える
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)
于 2013-07-30T12:01:32.607 に答える