2015-04-25 8 views
8

Mam kilka wiadomości e-mail Action Mailer i chciałbym przetestować, który układ będzie używany do renderowania wiadomości e-mail. Znalazłem this example on the web, ale pochodzi z 2008 roku i nie działa z Rails 3.2 i prawdopodobnie późniejszymi wersjami.Czy istnieje sposób sprawdzenia, który układ jest renderowany w e-mailu Action Mailer?

Moja motywacja polega na tym, że chciałbym napisać test jednostkowy, który zapewnia, że ​​program pocztowy jest renderowany z określonym układem, więc jeśli to się zmieni, test się zepsuje.

+0

Hey Luke. A co z twierdzeniem, które wyraźnie renderuje szablon z zestawem arkuszy i porównuje tekst lub HTML z tym, co jest generowane (z dowolnym układem, który jest aktualnie określony)? Myślałem, że jeśli ktoś zmieni wartość układu w programie pocztowym później, test zakończy się niepowodzeniem. Nie próbowałem tego, ale czytałem ten test i miałem ten pomysł: https://github.com/rails/rails/blob/master/actionmailer/test/base_test.rb#L545 To powiedziawszy, wygląda na to, że jest musi być zmienną instancji z nazwą ukrycia ukrytą gdzieś, co możesz sprawdzić (lub dodać ją jako łatkę). –

Odpowiedz

3

ActionController::TestCase ma metodę assert_template, więc coś jak to powinno działać:

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

Testowanie układu świadczonych podczas wysyłania e-maile mogą być wykonywane w ramach badań kontrolerów wykorzystujących assert_template.

Biorąc pod uwagę następujące klasy Mailer i sposób,

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 

zresetować hasło e-mail zostanie wygenerowana za pomocą my_layout.html.erb układ.

Ta metoda Mailer może być wywoływana w metodzie UsersController, np:

class UsersController < ApplicationController 


    def forgot_password 
    user = ... 
    Notifier.password_reset_instructions(user).deliver_now 
    end 

end 

Oświadczenie assert_template layout: "my_layout" w poniższym teście kontrolera dla users_controller#forgot_password by zweryfikować układ używany:

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 

odpowiednie części z dziennika:

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) 

Referencje:

  1. Action Mailer Basics
  2. Testing Your Mailers - Functional Testing
  3. assert_template method
Powiązane problemy