私はRails 4アプリケーションを開発していますが、これにはメールの送受信が含まれます。たとえば、ユーザー登録、ユーザーコメント、およびアプリの他のイベント中にメールを送信します。
アクションmailer
を使用してすべてのメールを作成し、テストにrspec
およびshoulda
を使用しました。メールが適切なユーザーに正しく受信されるかどうかをテストする必要があります。動作をテストする方法がわかりません。
ActionMailer
とshoulda
を使用してrspec
をテストする方法を教えてください。
RSpecを使用してActionMailerをテストする方法に関する 良いチュートリアル があります。これは私が従った慣行であり、まだ失敗していません。
チュートリアルは、Rails 3および4。
上記のリンクのチュートリアルが中断した場合、関連する部分は次のとおりです。
次のNotifier
メーラーとUser
モデルを想定しています:
class Notifier < ActionMailer::Base
default from: '[email protected]'
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: '[email protected]' }
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(['[email protected]'])
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
このトピックに関する元のブログ投稿については、ルーカス・キャトンの小道具。