how to test sending emails to both recipients (Rspec)

email, rspec, ruby, ruby-on-rails

Solution

Firstly you should ensure they have different email addresses.

Assuming your factory handles that (have you seen the `Faker` gem?) then you can test what was sent in the last sent message like this:

# The last email sent 
ActionMailer::Base.deliveries.last

You can check that the right number of messages were sent:

ActionMailer::Base.deliveries.count

So your test could look something like this:

describe "User request update" do
  let(:user_one) { FactoryGirl.create(:user) }
  let(:user_two) { FactoryGirl.create(:user) }
  # let(:mail) { UserMailer.notify_users(user_one, user_two) } 

  # If your method sends two separate emails:
  it "#notify_users should notify both users" do
    UserMailer.notify_users(user_one, user_two)
    expect(ActionMailer::Base.deliveries.count).to eq(2)
    expect(ActionMailer::Base.deliveries[0].to).to include(user_one.email)
    expect(ActionMailer::Base.deliveries[1].to).to include(user_two.email)
  end

  # If your method sends a single email with both recipients
  it "#notify_users should notify both users" do
    UserMailer.notify_users(user_one, user_two)
    expect(ActionMailer::Base.deliveries.count).to eq(1)
    expect(ActionMailer::Base.deliveries.last.to).to include(user_one.email)
    expect(ActionMailer::Base.deliveries.last.to).to include(user_two.email)
  end
end

You can make this a little nicer with some helper macros. Full details on how to do this are in this railscast:

http://railscasts.com/episodes/275-how-i-test

Problem

Here is my test which is failing at the moment : ``` describe "User request update" do let(:user_one) { FactoryGirl.create(:user) } let(:user_two) { FactoryGirl.create(:user) } let(:mail) { UserMailer.notify_users(user_one, user_two) } it "should notify both users" do mail.to.should include(user_one.email) mail.to.should include(user_two.email) end end ``` Here is my mailer bit : ``` def notify_users(requestor, user) [requestor, user].each{ |u| notify_user(requestor, u) } end def notify_user(requestor, user) @requestor = requestor @user = user mail :to => user.email, :subject => "User requested update" end ``` How can I test is the mail being sent to both users?

Original source