この記事の内容
メール受信周りの機能を実装中、RSpecでActionMailbox
のテストを書くことになりました。
RailsガイドやパーフェクトRuby on RailsにはMiniTest
の事例しか載っておらず、日本語の資料も少なかったので手順をメモしておきます。
ただし、ActionMailbox
の実像そのものは他に良い記事がたくさんあるので、本記事ではあくまでもRSpecによるテスト記載について取り扱っています。
前提
使用したRailsとRSpecのバージョンは下記の通りです。
Rails 6.0.0
RSpec 5.0.1
また、テスト対象のMailBox
内ではこのようにprocess
メソッドを使ってメール送信処理を実装しています。
class ExamplesMailbox < ApplicationMailbox
before_processing :set_organization
def process
# ...
end
end
準備
rspec-railsのバージョンをRails6系対応にする
ActionMailbox
がRails6の機能なので、RSpecもRails6に対応したものにする必要があります(←ここに気づかなくて結構ハマった)。
RSpecのGithubのReadmeによるとRails6系にはRSpec5系が必要なようなので、RSpecをアップデート合わせます。
bundle update rspec
依存するGemのアップデートが必要だと出たら、それもアップデートしましょう。
RSpecでActionMailbox::TestHelper
を使えるようにする
Rails(Mini Test)の機能である、ActionMailbox::TestHelper
をRSpec
でも使いたいので、spec/rails_helper.rb
に以下のように記載します。
require 'action_mailbox/test_helper'
RSpec.configure do |config|
config.include ActionMailbox::TestHelper, type: :mailbox
end
これで、 type: :mailbox
のテストの際にActionMailbox::TestHelperのメソッドが使えるようになります。
実装
実際に書いたコードは概ね下記の通りです。
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系以上で利用できます。
その他、色々なMailbox用のRSpecが同じページに載っていて、便利でした。
感想、参考文献
以上で実装完了です。
実装時にはかなり苦労しましたが、改めて書き直してみるとなんてことなかったですね。。。。
実装にはこちらの記事の記述が丁寧で役立ちました!