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

results matching ""

    No results matching ""