【Rails】ActionMailer 테스트에서 Mail::Matchers 사용

소개



CBcloud Advent Calendar 2020의 둘째 날 기사입니다.

이 기사에서는 메일 전송 단위 테스트 중에 ActionMailer가 의존하는 메일에 포함된 Mail::Matchers를 RSpec의 매처로 사용하는 방법을 소개합니다.

또, 비교 대상으로서, 이하의 2개도 동시에 기재합니다.
  • Rails Guides에 설명 된 테스트 방법
  • RSpec 문서에 설명 된 테스트 방법

  • 마지막으로, Mail::Matchers 를 사용한 예의 소개와, 실제로 움직이는 샘플 코드를 첨부합니다.

    동작 확인 환경


  • ruby ​​2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-darwin19]
  • actionmailer (6.0.3.4)
  • rspec (3.10.0)

  • 테스트 코드



    Rails Guides에 설명된 테스트 방법


    
    require 'test_helper'
    
    class UserMailerTest < ActionMailer::TestCase
      test "invite" do
        # Create the email and store it for further assertions
        email = UserMailer.create_invite('[email protected]',
                                         '[email protected]', Time.now)
    
        # Send the email, then test that it got queued
        assert_emails 1 do
          email.deliver_now
        end
    
        # Test the body of the sent email contains what we expect it to
        assert_equal ['[email protected]'], email.from
        assert_equal ['[email protected]'], email.to
        assert_equal 'You have been invited by [email protected]', email.subject
        assert_equal read_fixture('invite').join, email.body.to_s
      end
    end
    

    RSpec 문서에 설명된 테스트 방법


    require "rails_helper"
    
    RSpec.describe NotificationsMailer, :type => :mailer do
      describe "notify" do
        let(:mail) { NotificationsMailer.signup }
    
        it "renders the headers" do
          expect(mail.subject).to eq("Signup")
          expect(mail.to).to eq(["[email protected]"])
          expect(mail.from).to eq(["[email protected]"])
        end
    
        it "renders the body" do
          expect(mail.body.encoded).to match("Hi")
        end
      end
    end
    

    Mail::Matchers를 사용한 테스트 방법



    ActionMailer에 따라 Mail gem이 이미 설치되어 있으므로 배포 절차가 간단합니다.
  • RSpec 설정에서 Mail::Matchers를 include
  • ActionMailer 테스트에서 Mail::Matchers에서 제공하는 매처 사용

  • 다음은 실제로 Mail::Matchers를 사용하여 작성한 코드입니다.
    비교를 위해, 최초의 문맥에서는 앞서 설명한 RSpec 의 문서에 기재된 샘플을 답습한 코드를 구현하고 있습니다.
    RSpec.configure do |config|
      config.include Mail::Matchers, type: :mailer
    end
    
    RSpec.describe NotificationsMailer, type: :mailer do
      before do
        ActionMailer::Base.deliveries.clear
      end
    
      describe '#signup' do
        # @see: https://relishapp.com/rspec/rspec-rails/v/3-9/docs/mailer-specs/mailer-spec
        context 'when using RSpec mailer examples' do
          subject(:mail) { described_class.signup }
    
          it 'renders the headers' do
            expect(mail.subject).to eq('Signup')
            expect(mail.to).to eq(['[email protected]'])
            expect(mail.from).to eq(['[email protected]'])
          end
    
          it 'renders the body' do
            expect(mail.body.encoded).to match('Hi')
          end
    
          it 'sends the mail' do
            expect { mail.deliver_now }.to change { ActionMailer::Base.deliveries.count }
          end
        end
    
        # @see: https://github.com/mikel/mail#using-mail-with-testing-or-specing-libraries
        context 'when using Mail::Matchers' do
          subject(:mail) { described_class.signup.deliver_now }
    
          it { is_expected.to have_sent_email }
          it { is_expected.to have_sent_email.from('[email protected]') }
          it { is_expected.to have_sent_email.to('[email protected]') }
          it { is_expected.to have_sent_email.with_subject('Signup') }
          it { is_expected.to have_sent_email.with_body('Hi') }
        end
      end
    end
    

    메일 송신 후의 매처가 모두 have_sent_email에 집약되어 ​​있는 것을 알 수 있군요.
    여기에서 소개한 것 이외에도 첨부 파일에 대한 매챠 등 메일 테스트에 필요한 것이 하나 갖추어져 있으므로 꼭 문서를 확인하고 사용해보십시오.
    htps : // 기주 b. 코 m / 미케 l / 마이 l # 우신 g - 마이 l - 우 - th - s-chin - rs - spein g - b b ririe s

    마지막으로



    여기까지 읽고, 실제로 스스로 시도하고 싶은 분들을 위해서, 움직이는 샘플 코드를 Gist 로 공개하고 있습니다.
    htps : // 기 st. 기주 b. 코 m/토모히로/d후7362cd066d87f25f40bd6856513

    실행 예:


    여담



    개인적으로는 --format documentation 로 출력했을 때의 표현이 중복으로 느껴지고 있습니다.

    참고 자료


  • Testing Rails Applications — Ruby on Rails Guides
  • mailer spec - Mailer specs - RSpec Rails - RSpec - Relish
  • mikel/mail: A Really Ruby Mail Library
  • 좋은 웹페이지 즐겨찾기