2015-04-25 4 views
8

Ich habe einige Action Mailer E-Mail-Nachrichten und möchte testen, welches Layout zum Rendern der E-Mail verwendet wird. Ich habe this example on the web gefunden, aber es ist von 2008 und funktioniert nicht mit Rails 3.2 und vermutlich späteren Versionen.Gibt es eine Möglichkeit zu testen, mit welchem ​​Layout eine Action Mailer E-Mail gerendert wird?

Meine Motivation dafür ist, dass ich einen Komponententest schreiben möchte, der behauptet, dass der Mailer mit einem bestimmten Layout gerendert wurde. Wenn das geändert wird, bricht der Test ab.

+0

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). –

Antwort

3

ActionController::TestCase hat eine Methode assert_template, so etwas wie dies funktionieren sollte:

class MailerTest < ActionController::TestCase 
    ... 
    def test_layout 
     assert_template layout: "layout/something" 
    end 
    ... 
end 
2

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:

  1. Action Mailer Basics
  2. Testing Your Mailers - Functional Testing
  3. assert_template method
Verwandte Themen