2015-04-25 25 views
8

Bazı Eylem Mailer e-posta mesajları var ve e-posta işlemek için kullanılacak olan düzen test etmek istiyorum. Ben this example on the web buldum, ama 2008'den beri ve Rails 3.2 ve muhtemelen daha sonraki sürümleri ile çalışmıyor. Bunun içinBir Action Mailer e-postasının hangi düzende işlendiğini test etmenin bir yolu var mı?

Benim motivasyon bunu değiştirilirse test kıracak böylece mailler belirli bir düzen ile render olduğunu iddia Bir birim test yazmak istiyorum olmasıdır.

+0

Selam Luke. Ne açıkça belirlenen bir düzen ile şablonu oluşturur ve (şu anda belirtilen her türlü düzen ile) üretilir ne metin veya HTML karşılaştırır bir iddia hakkında? Benim düşüncem, eğer birisi maillerdeki düzen değerini değiştirirse, test başarısız olurdu. Bunu denemek ama bu testi bakarak bu fikri vardı yoktu: https://github.com/rails/rails/blob/master/actionmailer/test/base_test.rb#L545 söyleniyor, orada gibi görünüyor teftiş edebileceğiniz bir yere gömülmüş yerleşim adıyla bir örnek değişken olmalıdır (veya bir yama olarak ekleyiniz). –

cevap

3

ActionController::TestCase bir yöntem assert_template vardır, bu nedenle böyle bir şey çalışması gerekir: gönderme e-postalar assert_template kullanılarak kontrolör testlerinin bir parçası olarak yapılabilir iken

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

render düzeni test.

aşağıdaki mailler sınıf ve metot Verilen

,

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 

şifre sıfırlama e-my_layout.html.erb düzeni kullanarak işlenecek.

Bu mailler yöntemi, bir UsersController yöntemde çağrılan olasıdır örn:

class UsersController < ApplicationController 


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

end 

kullanılan düzen doğrulamayı tercih users_controller#forgot_password için aşağıdaki kontrolör testinde assert_template layout: "my_layout" deyimi:

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 

günlüğünden ilgili bölümleri:

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) 

Referanslar:

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