4 Stimmen

rspec/capybara: Wie simuliert man eingehende POST-Anfragen? (rack-test wird nicht funktionieren)

Ich muss eingehende E-Mails als Multipart-Formulardaten über eine POST-Anfrage von Cloudmailin empfangen. Die POST-Anfrage sieht wie folgt aus:

Parameters: {"to"=>"<email@exmaple.comt>", "from"=>"whomever@example", "subject"=>"my awesome subject line....

Eigentlich ist das Empfangen und Parsen von E-Mails ganz einfach, denn die E-Mail wird einfach als params gepostet: params[:to], params[:from], etc. Aber wie simuliere ich diese POST-Anfrage in Rails?

Ich habe eine Dummy-Rails-App gebaut, um Cloudmailin zu testen, also habe ich eine konkrete Anfrage. Allerdings ist es eine 6k-Zeichen-Datei, so möchte ich diese Datei als die Parameter der POST-Anforderung zu laden. Ich habe versucht, mit den eingebauten Rails post und post_via_redirect Methoden, um eine Datei zu laden, aber es entkommt alle Parameter( \"to\"), die nicht gut ist. Irgendwelche Ideen?

12voto

GoodGets Punkte 1809

Das habe ich dann auch getan:

@parameters = { "x_to_header"=>"<#{ @detail.info }>",
                "to"=>"<#{ @account.slug }@cloudmailin.net>",
                "from"=>"#{ @member.email }",
                "subject"=>"meeting on Monday",
                "plain"=>"here is my message\nand this is a new line\n\n\nand two new lines\n\n\n\nand a third new line"
              }

dann einfach:

post "/where_ever", @parameters

scheint die Arbeit vorerst zu erledigen

0voto

Ramon Tayag Punkte 13616

Ein einfacher Weg wäre wahrscheinlich, ein Skript in capybara auszuführen. Stellen Sie einfach sicher, dass mit dem @javascript Tag, dann laden Sie eine beliebige Seite in Ihrer Anwendung, auf der jQuery installiert ist (technisch gesehen brauchen Sie das nicht, aber es ist viel einfacher. Dann:

When /^I get a post request from Cloudmailin$/ do
  visit '/some/page/with/jquery'
  page.execute_script(%{$.post("/some/path?to=some_email&etc=etc");})
end

Da ist die einfache post Wasserschwein-Methode, aber ich bin mir nicht ganz sicher, wie das funktioniert. Es könnte sich lohnen, das zu prüfen.

0voto

Schadenfred Punkte 146

Ich habe diese Antwort gestern Abend gesehen, als ich meinen eigenen Testcode für Rails 3.2.8 aktualisiert habe, der das Mail-Gem verwendet, und dachte, ich würde teilen, was ich gefunden habe. Der Testcode ist für eine Anwendung, die einen POST von Cloudmailin annehmen und dann verarbeiten muss, um einen neuen Benutzer mit Devise zu erstellen, und dann eine Bestätigung an diesen Benutzer zu senden, der der Benutzer dann folgen kann, um ein Passwort zu wählen. Hier ist meine Controller-Spezifikation:

require 'spec_helper'

describe ThankyouByEmailController do

  message1 = Mail.new do 

    from "Frommy McFromerton <frommy.mcfrommerton@gmail.com>"
    to "toey.receivesalot@gmail.com"
    subject "cloudmailin test"
    body 'something'

    text_part do
      body 'Here is the attachment you wanted'
    end

    html_part do
      content_type 'text/html; charset=UTF-8'
      body '<h1>Funky Title</h1><p>Here is the attachment you wanted</p>'
    end
  end

  describe "creating new users" do

    describe "unregistered FROM sender and Unregistered TO receiver" do

      it "should create 2 new users" do
        lambda do
          post :create, :message => "#{@message1}"
        end.should change(User, :count).by(2)
      end
    end
  end
end

Ich hoffe, dass Sie damit Ihre eigenen Tests bereinigen können. Und für alle anderen, die daran interessiert sind, das Mail-Gem zu testen, ist die Dokumentation von mikel ein langer Weg für dasselbe:

https://github.com/mikel/mail

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X