2016-07-21 14 views
1

私は最初の宝石のスペックを書いています。しかし、私はこの奇妙なエラーで立ち往生しています。私はこのエラーを取得していますrspecを実行したときに、私のRSpecのための コードがrspecの#<Hash:0x007ff3625a4800>のhttparty未定義メソッド `code 'を取得

describe '#success' do 
    let(:resp) { {"TwilioResponse"=>{"SMSMessage"=>{"Sid"=>"0d1c0cbfb2b5e8f97dddb4479bdbbc6a", "AccountSid"=>"exotel_sid", "From"=>"/exotel_sid", "To"=>"1234", "DateCreated"=>"2016-07-18 15:35:29", "DateUpdated"=>"2016-07-18 15:35:29", "DateSent"=>nil, "Body"=>"test sms", "Direction"=>"outbound-api", "Uri"=>"/v1/Accounts/exotel_sid/Sms/Messages/0d1c0cbfb2b5e8f97dddb4479bdbbc6a", "ApiVersion"=>nil, "Price"=>nil, "Status"=>"queued"}}} } 
    before{ allow(Generator::Exotel).to receive(:post).with("/#{Generator::configuration.sid}/Sms/send", 
     {:body => {:To => 1234, :Body => 'test sms'},:basic_auth=>{:username=>"#{Generator::configuration.sid}", :password=>"#{Generator::configuration.token}"}}).and_return(resp) } 

    it 'returns response object' do 
     response = Generator::Exotel.send(:to => 1234, :body => "test sms") 
     expect(response).to eq ({"Status"=>200, "Message"=>"Success"}) 
    end 
    end 

ある

NoMethodError: 
     undefined method `code' for #<Hash:0x007ff3625a4800> 

私はresponse.codeと呼ばれている

def handle_response(response) 
    response_base = response['TwilioResponse'] 
    if response_base.include?('RestException') 
    response_base['RestException'] 
    else 
    {"Status" => response.code, "Message" => "Success" } 
    end 
end 

私はhttpartyを知っているがresponseを作成する場所です要求のためのオブジェクトと応答コードを返します。しかし、私はどのようにダミーを作成するのですか?response_code 私のテストケースが合格するようになりました。私がここにこだわってから2日近くです。誰でも助けてください。私は本当にルビーと初めての仕様を書くのは初めてです。どんな助けもありがとう。

更新からresponse.inspect

> Generator::Exotel.send(:to => 9030435595, :body => 'jsdhgjkdfg')

のために、それは応答

> #<HTTParty::Response:0x7fb8c02f93d0 parsed_response={"TwilioResponse"=>{"SMSMessage"=>{"Sid"=>"d6ee0650072c82941ad2f06746d14ab4", "AccountSid"=>"sinscary", "From"=>"/sinscary", "To"=>"9030435595", "DateCreated"=>"2016-07-21 19:56:07", "DateUpdated"=>"2016-07-21 19:56:07", "DateSent"=>nil, "Body"=>"jsdhgjkdfg", "Direction"=>"outbound-api", "Uri"=>"/v1/Accounts/sinscary/Sms/Messages/d6ee0650072c82941ad2f06746d14ab4", "ApiVersion"=>nil, "Price"=>nil, "Status"=>"queued"}}}, @response=#<Net::HTTPOK 200 OK readbody=true>, @headers={"content-type"=>["application/xml"], "date"=>["Thu, 21 Jul 2016 14:26:07 GMT"], "server"=>["Apache/2.2.29 (Amazon)"], "x-powered-by"=>["PHP/5.3.28"], "content-length"=>["542"], "connection"=>["Close"]}> 
+0

どこかにあなたはxxxはハッシュである 'xxx.code'を呼んでいる、あなたが呼び出しされるべきであるとその可能性'xxx [:code]'。最小、完全、および検証可能な例を提供してください:http://stackoverflow.com/help/mcve – Yule

+0

はい@Yule私は私のコードで 'response.code'を呼び出しています。私は私の質問を更新しました。 – Sinscary

+0

私は 'xxx [:code]'を提案してみましたが、ハッシュにそのようなキーがないので 'nil'を返します。 – Sinscary

答えて

2

OKを以下返す結果、あなたはHTTParty::Responseをからかっています。一つの方法は、唯一のcodeparsed_responseと直接それを模擬するために、次のようになります。

let(:resp) do 
    Struct.new(:code, :parsed_response).new(200, {"TwilioResponse"=>...}) 
end 

もう一つの方法は、との本当のHTTParty::Responseをインスタンス化するために、次のようになります。私は最初のアプローチとなるだろう

let(:resp) do 
    HTTParty::Response.new(
    nil, 
    Struct.new(:code, :parsed_response) 
      .new(200, {"TwilioResponse"=>...}), -> { ... } 
) 
end 

。あなたはおそらくhandle_responseに変更する必要があることに、注意してください:

response_base = response['TwilioResponse'] 

response_base = response.parsed_response['TwilioResponse'] 
+0

ちょっと@mudasobwaさんへの返信ありがとうございます。はい、最初の方法は良いですが、私は2番目の方法を使用したいと思います。しかし、私はエラー 'NoMethodError: 未定義のメソッド 'body' for 200:Fixnum'、それに関する助けを得ています。 – Sinscary

+0

ああ、申し訳ありませんが、私は急いで不完全な例を投稿しました。私がリンクしている 'HTTParty :: Response#initialize'コードで分かるように、2番目のパラメータは応答オブジェクトです。アップデートをご覧ください。ところで、私はここで2番目のアプローチを使用する理由はないので、それを再チェックするのはあまりにもかかりませんでした。 – mudasobwa

+0

こんにちは、ありがとう、最初のアプローチが働いた。 2番目のアプローチでは、同じエラーが発生します。この議論のために ' - > {...}'が何であるか説明できますか? – Sinscary

関連する問題