41

メールの送受信を含むRails 4アプリケーションを開発しています。たとえば、ユーザー登録、ユーザー コメント、およびアプリ内のその他のイベント中にメールを送信します。

アクションを使用してすべてのメールを作成し、テストmailerに と を使用rspecしました。shouldaメールが適切なユーザーに正しく受信されるかどうかをテストする必要があります。動作をテストする方法がわかりません。

ActionMailerを使用して をテストする方法を教えてください。shouldarspec

4

1 に答える 1

64

RSpec で ActionMailer をテストする方法

Notifier次のメーラーとUserモデルを想定しています。

class Notifier < ActionMailer::Base
  default from: 'noreply@company.com'

  def instructions(user)
    @name = user.name
    @confirmation_url = confirmation_url(user)
    mail to: user.email, subject: 'Instructions'
  end
end

class User
  def send_instructions
    Notifier.instructions(self).deliver
  end
end

そして、次のテスト構成:

# config/environments/test.rb
AppName::Application.configure do
  config.action_mailer.delivery_method = :test
end

これらの仕様は、あなたが望むものを得るはずです:

# spec/models/user_spec.rb
require 'spec_helper'

describe User do
  let(:user) { User.make }

  it "sends an email" do
    expect { user.send_instructions }.to change { ActionMailer::Base.deliveries.count }.by(1)
  end
end

# spec/mailers/notifier_spec.rb
require 'spec_helper'

describe Notifier do
  describe 'instructions' do
    let(:user) { mock_model User, name: 'Lucas', email: 'lucas@email.com' }
    let(:mail) { Notifier.instructions(user) }

    it 'renders the subject' do
      expect(mail.subject).to eql('Instructions')
    end

    it 'renders the receiver email' do
      expect(mail.to).to eql([user.email])
    end

    it 'renders the sender email' do
      expect(mail.from).to eql(['noreply@company.com'])
    end

    it 'assigns @name' do
      expect(mail.body.encoded).to match(user.name)
    end

    it 'assigns @confirmation_url' do
      expect(mail.body.encoded).to match("http://aplication_url/#{user.id}/confirmation")
    end
  end
end

このトピックに関する最初のブログ投稿について、Lucas Caton に感謝します。

于 2013-11-14T16:42:42.933 に答える