2015-04-25 12 views
8

Tôi có một số thư email của Action Mailer và tôi muốn kiểm tra bố cục nào sẽ được sử dụng để hiển thị email. Tôi tìm thấy this example on the web, nhưng đó là từ năm 2008 và không hoạt động với Rails 3.2 và có lẽ là các phiên bản sau này.Có cách nào để kiểm tra bố cục nào mà email của Người gửi thư hành động được hiển thị không?

Động lực của tôi cho điều này là tôi muốn viết một bài kiểm tra đơn vị xác nhận rằng bưu phẩm được hiển thị với bố cục cụ thể để nếu điều đó được thay đổi, bài kiểm tra sẽ bị hỏng.

+0

Hey Luke. Điều gì về một khẳng định mà làm cho các mẫu với một bố trí thiết lập một cách rõ ràng, và so sánh các văn bản hoặc HTML để những gì được tạo ra (với bất kỳ bố trí hiện đang được chỉ định)? Suy nghĩ của tôi là nếu ai đó thay đổi giá trị bố trí trong bưu phẩm sau đó, kiểm tra sẽ thất bại. Không thử điều này, nhưng tôi đã đọc bài kiểm tra này và có ý tưởng đó: https://github.com/rails/rails/blob/master/actionmailer/test/base_test.rb#L545 Điều đó đang được nói, có vẻ như ở đó phải là một biến mẫu với tên bố cục được chôn ở đâu đó mà bạn có thể kiểm tra (hoặc thêm nó dưới dạng bản vá). –

Trả lời

3

ActionController::TestCase có một phương pháp assert_template, vì vậy một cái gì đó như thế này nên làm việc:

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

Thử nghiệm bố trí render trong khi gửi email có thể được thực hiện như một phần của các cuộc thử nghiệm điều khiển sử dụng assert_template.

Với lớp bưu phẩm sau đây và phương pháp,

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 

mật khẩu email đặt lại sẽ được trả lại bằng my_layout.html.erb bố trí.

phương pháp bưu phẩm này có khả năng được áp dụng trong một phương pháp UsersController, ví dụ:

class UsersController < ApplicationController 


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

end 

Các assert_template layout: "my_layout" tuyên bố trong các thử nghiệm điều khiển sau cho users_controller#forgot_password sẽ xác minh bố trí sử dụng:

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 

Các các phần liên quan từ nhật ký:

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) 

Tài liệu tham khảo:

  1. Action Mailer Basics
  2. Testing Your Mailers - Functional Testing
  3. assert_template method
Các vấn đề liên quan