Everyday Rails - 8日目

10.その他のテスト

この章はコード部分がないので簡単に、テストが通るくらいの感じで。

Emailのテスト部分。

# :
require 'email_spec'

RSpec.configure do |config|
  # :
  # Email Spec
  config.include EmailSpec::Helpers
  config.include EmailSpec::Matchers
end
  • Mailerテスト用にパスだけつくる

実際Actionなど無くてもパスは作れた

  • config/routes.rb
  get 'friendship/:user_id/:friend_id', to: 'users#edit_friendship', as: 'edit_friendship'
  • Mailerを作る
./bin/rails g maier UserMailer friend_request
  • app/mailers/user_mailer.rb
class UserMailer < ActionMailer::Base
  default from: "from@example.com"

  def friend_request(user, friend)
    @path = edit_friendship_path(user, friend)
    mail subject: "New friend request from #{friend.name}",
      to: user.email
  end
end
  • app/views/user_mailer/friend_request.text.haml
= @path
  • spec/mailers/user_mailer_spec.rb
require "rails_helper"

describe UserMailer, type: :mailer do
  describe 'friend_request' do
    let(:from) { "from@example.com"  }
    let(:user) { create(:user) }
    let(:friend) { create(:contact) }
    let(:subject_text) { "New friend request from #{friend.name}" }
    let(:body_text) { edit_friendship_path(user, friend) }

    context 'use email spec' do
      before do
        UserMailer.friend_request(user, friend).deliver
      end

      it 'メールが送信されること' do
        expect(open_last_email).to have_subject subject_text
        expect(open_last_email).to be_delivered_to user.email
        expect(open_last_email).to be_delivered_from from
        expect(open_last_email).to have_body_text body_text
      end
    end

    context 'new mail object' do
      let(:mail) { UserMailer.friend_request(user, friend) }

      it 'メールが送信されること' do
        expect(mail.subject).to eq subject_text
        expect(mail.to).to eq [user.email]
        expect(mail.from).to eq [from]
        expect(mail.body.encoded).to match body_text
      end
    end
  end
end

今日の感想

Emailの送信テストが簡単にできるのはいいね。
Email Specはcontrollerやfeatureのテストで使わないと意味が無さそう。
英語が分からないので、テスト名は日本語で書いちゃう。
英語勉強しよう。