In einer Aktion über eine Post-Anforderung rief ich eine Ressource nennt RequestOffer bin zu schaffen und eine E-Mail mit Action mit der erstellte Ressource als Parameter senden:Rspec: Wie verwendet man erwarten, mit einer Ressource zu erhalten, die noch nicht existiert?
@request_offer = RequestOffer.new(request_offer_params)
if @request_offer.save
RequestOfferMailer.email_team(@request_offer).deliver_later
end
Wenn meine Controller-Spezifikation, ich testen will, dass RequestOfferMailer wird mit der Methode email_team mit der Ressource @request_offer als Parameter aufgerufen.
Wenn ich Benutzer erwarten (XXX). Zu empfangen (YYY) .with (ZZZ), die einzige Möglichkeit, die ich gefunden habe, war meine Erwartung zu erklären, bevor Sie die POST-Anfrage. ZZZ wird jedoch durch diese POST-Anfrage erstellt, sodass ich meine Erwartungen vorher nicht festlegen kann.
# Set expectation first
message_delivery = instance_double(ActionMailer::MessageDelivery)
# ZZZ used in .with() does not exist yet, so it won't work
expect(RequestOfferMailer).to receive(:email_team).with(ZZZ).and_return(message_delivery)
expect(message_delivery).to receive(:deliver_later)
# Make POST request that will create ZZZ
post :create, params
Irgendeine Idee, wie man dieses Problem löst?
Ich würde idealerweise mehr als das testen. Allerdings bietet Ihr Link etwas, das eine Lösung sein könnte: https://relishapp.com/rspec/rspec-mocks/v/3-0/docs/setting-constraints/matching-arguments#using-a- custom-matcher Ich könnte eine Überprüfung definieren, dass es sich um eine Instanz eines RequestOffer handelt, indem auch die wichtigen Attribute wie phone_number und email in meinem Fall, die in der Vorlage der E-Mail benötigt werden, gleich sind. Mal sehen ob jemand eine einfachere Lösung hat, aber danke schon für den Hinweis! –