【Rails】ActionMailer 테스트에서 Mail::Matchers 사용
13589 단어 RSpecActionMailer루비Rails
소개
CBcloud Advent Calendar 2020의 둘째 날 기사입니다.
이 기사에서는 메일 전송 단위 테스트 중에 ActionMailer가 의존하는 메일에 포함된
Mail::Matchers
를 RSpec의 매처로 사용하는 방법을 소개합니다.또, 비교 대상으로서, 이하의 2개도 동시에 기재합니다.
마지막으로,
Mail::Matchers
를 사용한 예의 소개와, 실제로 움직이는 샘플 코드를 첨부합니다.동작 확인 환경
테스트 코드
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이 이미 설치되어 있으므로 배포 절차가 간단합니다.
Mail::Matchers
를 include 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
로 출력했을 때의 표현이 중복으로 느껴지고 있습니다.참고 자료
Reference
이 문제에 관하여(【Rails】ActionMailer 테스트에서 Mail::Matchers 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Tomohiro/items/c45adb704a87f2c7b519텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)