(1) Consider you have a notification mailer to send an email when some events happen. E.g.
class NotificationMailer < ApplicationMailer
def report_event(events, email)
return if events.nil? || events.size == 0
return if email.blank?
@events = events
mail(to: email, subject: 'Events Notification')
end
end
(2) Now this mailer method supposes to:
- Send an email according to the supplied email address.
- Send an email if at least 1 event happens.
- Send an email with title "Events Notification".
(3) To test above specification with RSpec. First, we need to setup a test environment, so the test will not actually send an email during the testing.
before(:each) do ActionMailer::Base.delivery_method = :test ActionMailer::Base.perform_deliveries = true ActionMailer::Base.deliveries = [] end after(:each) do ActionMailer::Base.deliveries.clear end
(4) Then, you can add your test spec.
it 'should not proceed if email is empty' do
NotificationMailer.report_event(%w(1 2 3 4 5), '').deliver_now
expect(ActionMailer::Base.deliveries.count).to eq(0)
end
it 'should not proceed if there is no event' do
NotificationMailer.report_event([], 'calvin@atomnode.com').deliver_now
expect(ActionMailer::Base.deliveries.count).to eq(0)
end
it 'should send an email' do
NotificationMailer.report_event(%w(1 2 3 4 5), 'email@destination.com').deliver_now
expect(ActionMailer::Base.deliveries.count).to eq(1)
end
it 'sends to the correct receiver' do
NotificationMailer.report_event(%w(1 2 3 4 5), 'email@destination.com').deliver_now
expect(ActionMailer::Base.deliveries.first.to.first).to eq('email@destination.com')
end
it 'should set the subject correctly' do
NotificationMailer.report_event(%w(1 2 3 4 5), 'email@destination.com').deliver_now
expect(ActionMailer::Base.deliveries.first.subject).to eq('Events Notification')
end