das Layout Test gemacht, während das Senden von E-Mails im Rahmen der Controller-Tests durchgeführt werden können assert_template
verwenden.
folgende Mailer-Klasse und angewandten Methoden,
class Notifier < ActionMailer::Base
def password_reset_instructions(user)
@user = user
@reset_password_link = ...
mail(to: ..., from: ...., subject: "Password Reset Instructions") do |format|
format.html {render layout: 'my_layout'}
format.text
end
end
end
das Passwort zurückgesetzt E-Mail wird my_layout.html.erb
Layout mit gemacht werden.
Diese Mailer Methode ist wahrscheinlich in einer UsersController
Methode aufgerufen werden, zB:
class UsersController < ApplicationController
def forgot_password
user = ...
Notifier.password_reset_instructions(user).deliver_now
end
end
Die assert_template layout: "my_layout"
Anweisung in dem folgenden Controller-Test für users_controller#forgot_password
würde das Layout verifiziert:
class UsersControllerTest < ActionController::TestCase
test "forgot password" do
assert_difference 'ActionMailer::Base.deliveries.size', +1 do
post :forgot_password, email: @user.email
end
assert_response :redirect
assert_template layout: "my_layout"
assert_template "password_reset_instructions"
password_reset_email = ActionMailer::Base.deliveries.last
assert_equal "Password Reset Instructions", password_reset_email.subject
end
end
Die relevante Teile aus dem Protokoll:
Started POST "https://stackoverflow.com/users/forgot_password"
Processing by UsersController#forgot_password as HTML
...
Rendered notifier/password_reset_instructions.html.erb within layouts/my_layout (1.1ms)
Referenzen:
- Action Mailer Basics
- Testing Your Mailers - Functional Testing
- assert_template method
Hey Luke. Was ist mit einer Assertion, die die Vorlage mit einem Layout-Set explizit rendert und den Text oder HTML-Code mit dem vergleicht, was generiert wird (mit dem aktuell angegebenen Layout)? Mein Gedanke war, dass, wenn jemand später den Layout-Wert im Mailer ändert, der Test fehlschlagen würde. Habe das nicht ausprobiert, aber ich habe diesen Test gelesen und hatte folgende Idee: https://github.com/rails/rails/blob/master/actionmailer/test/base_test.rb#L545 Das scheint so zu sein muss eine Instanzvariable mit dem Layoutnamen sein, der irgendwo eingebettet ist, den Sie untersuchen könnten (oder fügen Sie ihn als Patch hinzu). –