Email Spec

A collection of RSpec matchers and Cucumber steps to make testing emails go smoothly.

This library works with ActionMailer and Pony. When using it with ActionMailer it works with DelayedJob, ActiveRecord Mailer, and action_mailer_cache_delivery.

When using the action_mailer_cache_delivery library you must use this fork:

If you are testing emails in conjunction with an automated browser solution, like Selenium, you will want to use action_mailer_cache_delivery in your test environment. (This is because your test process and server processes are distinct and therefore need an intermediate store for the emails.) DelayedJob and ActiveRecord Mailer will also work but you generally don't want to include those projects unless you need them in production.


script/plugin install git://

Gem Setup

gem install email_spec

# Gemfile
group :test do
  gem 'email_spec'


To use the steps in features put the following in your env.rb:

# Make sure this require is after you require cucumber/rails/world.
require 'email_spec' # add this line if you use spork
require 'email_spec/cucumber'

This will load all the helpers that the steps rely on. It will also add a Before hook for Cucumber so that emails are cleared at the start of each scenario.


rails generate email_spec:steps

This will give you a bunch of steps to get started with in step_definitions/email_steps.rb


First you need to require email_spec in your spec_helper.rb:

require "email_spec"

You will then need to include EmailSpec::Helpers and EmailSpec::Matchers in your example groups. If you want to have access to the helpers and matchers in all of your examples you can do the following in your spec_helper.rb:

Spec::Runner.configure do |config|

Otherwise, you will need to include them in the example groups you wish to use them:

describe "Signup Email" do
  include EmailSpec::Helpers
  include EmailSpec::Matchers



Scenario: A new person signs up
    Given I am at "/"
    When I fill in "Email" with "[email protected]"
    And I press "Sign up"
    And I should receive an email
    When I open the email
    Then I should see "confirm" in the email body
    When I follow "confirm" in the email
    Then I should see "Confirm your new account"

For more examples, check out examples/rails_root in the source for a small example app that implements these steps.


Testing In Isolation

It is often useful to test your mailers in isolation. You can accomplish this by using mocks to verify that the mailer is being called in the correct place and then write focued examples for the actual mailer. This is a simple example from the sample app found in the gem:

Verify that the mailer is used correctly in the controller (this would apply to a model as well):

describe "POST /signup (#signup)" do
  it "should deliver the signup email" do
    # expect
    UserMailer.should_receive(:deliver_signup).with("[email protected]", "Jimmy Bean")
    # when
    post :signup, "Email" => "[email protected]", "Name" => "Jimmy Bean"

Examples for the #signup method in UserMailer:

describe "Signup Email" do
  include EmailSpec::Helpers
  include EmailSpec::Matchers
  include ActionController::UrlWriter

  before(:all) do
    @email = UserMailer.("[email protected]", "Jojo Binks")

  it "should be set to be delivered to the email passed in" do
    @email.should deliver_to("[email protected]")

  it "should contain the user's message in the mail body" do
    @email.should have_body_text(/Jojo Binks/)

  it "should contain a link to the confirmation link" do
    @email.should have_body_text(/#{}/)

  it "should have the correct subject" do
    @email.should have_subject(/Account confirmation/)


Using the helpers when not testing in isolation

Don't. :) Seriously, if you do just take a look at the helpers and use them as you wish.

Original Authors

Ben Mabey, Aaron Gibralter, Mischa Fierer

Please see History.txt for upcoming changsets and other contributors.