この記事の内容
ActionMailboxは、Railsアプリでメールを受け取ることができる機能です。 それを応用して、 Railsアプリにメールを送ることで投稿を作成することもできます。
先日ActionMailboxを利用した機能開発中、RSpecで ActionMailbox
のテストを書くことになったのですが、
RailsガイドやパーフェクトRuby on RailsにはMiniTest
でのテスト作成事例しか載っておらず、日本語の資料も少なかったので手順をメモしておきます。
なお、ActionMailbox
の実装そのものには上記参考書籍・ガイドはじめ良い記事がたくさんあるので、本記事ではあくまでもRSpecによりActionMailbox
のテストを作成することに焦点を置いています。
前提
使用したRailsとRSpecのバージョンは下記の通りです。
Rails 6.0.0
RSpec 5.0.1
また、テスト対象のMailBox
内ではこのようにprocess
メソッドを使ってメール送信処理を実装しています。
# app/mailboxes/examples_mailbox.rb class ExamplesMailbox < ApplicationMailbox before_processing :set_organization def process # ここにメール送信の処理を記載 end end
準備
rspec-railsのバージョンをRails6系対応にする
ActionMailbox
はRails6の機能なので、RSpecもRails6に対応したものにする必要があります。
RSpecの公式サイト によるとAction Mailbox関連のRSpecはRSpecのバージョン4.0より出現しているようなので、RSpecをアップデート合わせます。
bundle update rspec
依存するGemのアップデートが必要だと出たら、それもアップデートしましょう。
RSpecでActionMailbox::TestHelper
を使えるようにする
Rails(Mini Test)の機能である、ActionMailbox::TestHelper
をRSpec
でも使いたいので、spec/rails_helper.rb
に以下のように記載します。
# spec/rails_helper.rb require 'action_mailbox/test_helper' RSpec.configure do |config| config.include ActionMailbox::TestHelper, type: :mailbox end
これで、 type: :mailbox
のテストの際にActionMailbox::TestHelperのメソッドが使えるようになります。
実装
実際に書いたコードは概ね下記の通りです。今回作成したのは、メールを特定のメールアドレスに送信すると、アプリケーション内に記録が1件作成される機能です。
# spec/mailboxes/examples_mailbox_spec.rb require 'rails_helper' RSpec.describe ExamplesMailbox, type: :mailbox do it "@your-domain-name.jpあてのメールを受信できる" do expect(ExamplesMailbox) .to receive_inbound_email(to: "sample@your-domain-name.jp") end context 'メールが送信された時' do let!(:mail) { Mail.new( from: 'replies@example.com', to: 'sample@your-domain-name.jp', subject: "メールのタイトル" ) } it 'logが一件生成される' do expect{ process(mail) }.to change(Log, :count).by(1) end # 以下略 ... end end
process
はRSpecのActionMailboxのメソッド で、RSpec4.0系以上で利用できます。
その他、色々なMailbox用のRSpecが同じページに載っていて、便利でした。
感想、参考文献
以上で実装完了です。 長い期間運営をしているアプリだと、RSpecのバージョンがあっているか確認した方が良い、というのが実装してみての感想でした。
実装にあたって参考にした記事はこちらです。(ページ下方にテストの方法もあります)