この記事の内容
ActionMailboxは、Railsアプリでメールを受け取ることができる機能です。 それを応用して、 Railsアプリにメールを送ることで投稿を作成することもできます。
先日ActionMailboxを利用した機能開発中、RSpecで ActionMailboxのテストを書くことになったのですが、
RailsガイドやパーフェクトRuby on RailsにはMiniTestでのテスト作成事例しか載っておらず、日本語の資料も少なかったので手順をメモしておきます。
なお、ActionMailboxの実装そのものには上記参考書籍・ガイドはじめ良い記事がたくさんあるので、本記事ではあくまでもRSpecによりActionMailboxのテストを作成することに焦点を置いています。
前提
使用したRailsとRSpecのバージョンは下記の通りです。
Rails 6.0.0RSpec 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のバージョンがあっているか確認した方が良い、というのが実装してみての感想でした。
実装にあたって参考にした記事はこちらです。(ページ下方にテストの方法もあります)