LoginSignup
0
0

More than 1 year has passed since last update.

ActionMailboxでRSpecのテストを書く

Last updated at Posted at 2021-06-08

この記事の内容

メール受信周りの機能を実装中、RSpecでActionMailboxのテストを書くことになりました。

RailsガイドパーフェクトRuby on RailsにはMiniTestの事例しか載っておらず、日本語の資料も少なかったので手順をメモしておきます。

ただし、ActionMailboxの実像そのものは他に良い記事がたくさんあるので、本記事ではあくまでもRSpecによるテスト記載について取り扱っています。

前提

使用したRailsとRSpecのバージョンは下記の通りです。

  • Rails 6.0.0
  • RSpec 5.0.1

また、テスト対象のMailBox内ではこのようにprocessメソッドを使ってメール送信処理を実装しています。

examples_mailbox.rb
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::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のメソッドが使えるようになります。

実装

実際に書いたコードは概ね下記の通りです。

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系以上で利用できます。

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

感想、参考文献

以上で実装完了です。
実装時にはかなり苦労しましたが、改めて書き直してみるとなんてことなかったですね。。。。
実装にはこちらの記事の記述が丁寧で役立ちました!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0