2016-05-23 3 views
1
config.before(:each) do 
    stub_request(:post, "https://api.3rdpartysmsprovider.com/send.php?body=This%20is%20a%20test%20message&destination=6&dlr='1'&output=json&password=0000000&reference=#{@text.sms_uid}&sender=silver&username=0000000"). 
    to_return(:status => 200, :body => "01", :headers => {}) 
end 

Ich schreibe gerade Spezifikationen für eine Serviceklasse, die eine SMS sendet und ein Protokoll davon in unserer Datenbank erstellt. Ich versuche diese Anfrage zu stubben, aber @text.sms_uid ist ein SecureRandom.urlsafe_base64 Zufallscode. Auch ich stubb in config.before(:each).Wie stub Anfragen in Domain oder nach Methode?

Daher kann ich nicht sms_uid in stub_request als die zufällige sms_uid wird nach dem Stub aufgerufen wird. Dies führt dazu, dass der Test jedes Mal fehlschlägt. Gibt es eine Möglichkeit, die Anfrage zu stubben, nachdem sie den Code erzeugt hat (mit anderen Worten, nachdem sie die spezifische Methode durchlaufen hat) oder gibt es eine Möglichkeit, alle Anfragen über die Domäne "https://api.silverstreet.com" zu löschen?

+0

In welcher Spezifikationsdatei haben Sie das hinzugefügt? –

Antwort

0

Ich sehe zwei Möglichkeiten:

  • Stub SecureRandom.urlsafe_base64 eine bekannte Zeichenfolge zurückzukehren und diese bekannte Zeichenfolge verwenden, wenn Sie stub_request:

    config.before(:each) do 
        known_string = "known-string" 
        allow(SecureRandom).to receive(:known_string) { known_string } 
        stub_request(:post, "https://api.3rdpartysmsprovider.com/send.php?body=This%20is%20a%20test%20message&destination=6&dlr='1'&output=json&password=0000000&reference=#{known_string}&sender=silver&username=0000000"). 
        to_return(status: 200, body: "01", headers: {}) 
    end 
    

    Wenn SecureRandom.urlsafe_base64 an anderen Orten in der Anwendung verwendet wird, Sie müssen es nur in den Spezifikationen stubben, in denen diese Anforderung generiert wird.

  • Ja, können Sie jede POST zu diesem Hostnamen

    stub_request(:post, "api.3rdpartysmsprovider.com"). 
        to_return(status: 200, body: "01", headers: {}) 
    

    oder auch jede Anforderung jeglicher Art zu diesem Hostnamen

    stub_request(:any, "api.3rdpartysmsprovider.com"). 
        to_return(status: 200, body: "01", headers: {}) 
    

    und webmock has a very large number of other ways to match requests Stummel.

+1

Hey danke für die Antwort! Ich hatte keine Ahnung, dass ich SecureRandom stubben könnte. Wie auch immer, ich habe es geschafft, es mit Regex 'stub_request zu lösen (: post,% r {https://api.3rdpartysmsprovider.com}). to_return (: status => 200,: body => "01",: headers => {}) ' was im Grunde ' stub_request (: post, "api.3rdpartysmsprovider.com") ist. to_return (Status: 200, Körper: "01", Header: {}) ' außer aus irgendeinem Grund stubbing es als String nicht für mich funktioniert –