2016-07-21 17 views
1

Ich schreibe Spezifikationen für mein erstes Juwel. Aber ich bin mit diesem seltsamen Fehler festgefahren. Code für mein rspec istbekommen httparty undefined Methode `Code 'für # <Hash: 0x007ff3625a4800> in rspec

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 

wenn ich rspec laufen Ich erhalte diese Störung

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

Dies ist, wo mein response.code ist

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

Ich weiß httparty eine response schafft genannt wird Objekt für die Anfrage und gibt den Antwortcode zurück. Aber ich bekomme nicht, wie ich einen Dummy response_code erstelle, so dass mein Testfall besteht. Es ist fast 2 Tage her, seit ich hier feststecke. Jeder hilft bitte. Ich bin wirklich neu in Ruby und zum ersten Mal Spec schreiben. Jede Hilfe wird geschätzt.

aktualisieren - für Folge response.inspect

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

es Antwort enthält folgende

> #<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

Seine wahrscheinlich, dass irgendwo sind Sie ruft 'xxx.code' wobei xxx ein Hash ist, sollten Sie anrufen 'xxx [: Code]'. Bitte geben Sie ein minimales, vollständiges und überprüfbares Beispiel an: http://stackoverflow.com/help/mcve – Yule

+0

ja @Yule Ich rufe 'response.code' in meinem Code an, wo ich eine Postanfrage stelle. Ich habe meine Frage aktualisiert. – Sinscary

+0

Ich habe versucht, wie Sie 'xxx [: code]' vorgeschlagen, aber es gibt 'nil' zurück, weil es keinen solchen Schlüssel im Hash gibt. – Sinscary

Antwort

2

OK, verspotten Sie eine HTTParty::Response. Eine Möglichkeit wäre, es zu verspotten direkt mit nur code und parsed_response:

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

Eine weitere Möglichkeit, eine echte HTTParty::Response mit zu instanziiert wäre:

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

Ich würde mit dem ersten Ansatz. Bitte beachten Sie, dass Sie wahrscheinlich in handle_response ändern müssen:

response_base = response['TwilioResponse'] 

zu

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

hey @mudasobwa danke für die Antwort. Ja, der erste Weg ist besser, aber ich würde gerne den 2. Weg benutzen. aber ich bekomme einen Fehler 'NoMethodError: undefined Methode 'Körper' für 200: Fixnum', jede Hilfe dazu. – Sinscary

+0

Oh, Entschuldigung, ich war in Eile und postete ein unvollständiges Beispiel. Wie Sie in dem Code "HTTParty :: Response # initialize" sehen konnten, den ich verlinkt habe, soll der zweite Parameter ein Antwortobjekt sein. Bitte sehen Sie ein Update. BTW, ich sehe hier keinen Grund, den zweiten Ansatz zu verwenden, deshalb war ich nicht zu wählerisch, es erneut zu überprüfen. – mudasobwa

+0

Hey gut danke, erster Ansatz funktioniert. Im zweiten Ansatz wird immer noch der gleiche Fehler angezeigt. Kannst du erklären, was '-> {...} ist, für das dieses Argument ist. – Sinscary