この記事の内容

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::TestHelperRSpecでも使いたいので、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

processRSpecのActionMailboxのメソッド で、RSpec4.0系以上で利用できます。

その他、色々なMailbox用のRSpecが同じページに載っていて、便利でした。

感想、参考文献

以上で実装完了です。 長い期間運営をしているアプリだと、RSpecのバージョンがあっているか確認した方が良い、というのが実装してみての感想でした。

実装にあたって参考にした記事はこちらです。(ページ下方にテストの方法もあります)