Mailer Spec
關於 Rails Mailer 請參考這篇文章 Action Mailer Basics。
以下介紹 Mailer 常見的測試標的。
命名慣例
文件擺放位置:
spec/mailers/[mailer_name]_spec.rb
譬如:
app/mailers/application_mailer.rb
對應的測試文件為 spec/mailers/application_mailer_spec.rb
。
app/mailers/users_mailer.rb
對應的測試文件為 spec/mailers/users_mailer_spec.rb
。
文件結構
class UserMailer < ApplicationMailer
def welcome
...
end
end
測試按 Mailer 內方法的撰寫順序來測:
require "rails_helper"
RSpec.describe UserMailer do
describe "#welcome" do
...
end
end
require "rails_helper"
非常重要,這樣才會把 Rails 跟相關的設定(spec/rails_helper.rb
)都載入進來。
T> 測試的順序建議跟 Mailer 方法的順序相同,這樣當測試檔案行數變多的時候,才容易找到測試的位置,讀你程式的人也比較好讀。重點是要保持一致性。
要測什麼
from
寄件人to
收件人subject
主旨body
信件內文
這些欄位可以這樣取出來:
mail = UserMailer.welcome_email # returns an instance of Mail
mail.from
mail.to
mail.subject
mail.body
class UserMailer
def welcome(user)
@user = user
end
end
RSpec.describe UserMailer do
describe "#welcome" do
it "send welcome user email" do
user = create(:user)
mail = UserMailer.welcome(user)
expect(mail.from).to eq ["[email protected]"]
expect(mail.to).to eq ["[email protected]"]
expect(mail.subject).to eq("Welcome to Apple.com")
expect(mail.body).to include user.full_name
expect(mail.body).to include user.email_address # 或檢查任何需要出現在信裡面重要的內容。
end
end
end
ApplicationMailer
假設我們的專案每一個 Mailer 都有共同的設定,可以模仿 Controller 有個 ApplicationController
,建一個 ApplicationMailer
出來:
$ touch app/mailers/application_mailer.rb
填入以下內容:
class ApplicationMailer < ActionMailer::Base
default from: "[email protected]",
bcc: "[email protected]"
end
假設每封信預設的回覆人都是 [email protected]
,然後要 bcc 我們的老闆:[email protected]
。那該怎麼樣測試呢?
$ touch spec/mailers/application_mailer_spec.rb
填入以下內容:
require "rails_helper"
RSpec.describe ApplicationMailer do
describe "#test" do
let(:email) { Mailer.test }
Mailer = Class.new(ApplicationMailer) do
def test
mail(body: "") # We need a body to not render views
end
end
it { expect(email.from).to eq ["[email protected]"] }
it { expect(email.bcc).to eq ["[email protected]"] }
end
end
這裡建了一個假 Mailer 來進行測試,必須要使用空白的 body,否則 Mailer 會 render view 出來。
延伸閱讀
Rails 官方關於 Mailer 測試的文章:Testing Your Mailers。