[rspec-users] feedback on matcher

Michael Guterl mguterl at gmail.com
Thu Jan 27 08:48:13 EST 2011


We have moved from Rails 2 to 3 and the changing Mailer syntax has
caused us to rewrite some of our specs.

In Rails 2:

Implementation:
  Mailer.deliver_job_application(job.id, user.id)

Spec:
  Mailer.should_receive(:deliver_job_application).with(@job.id, @user.id)

---

In Rails 3:

Implementation:
  Mailer.job_application(job.id, user.id).deliver

Spec:
  message = double
  message.should_receive(:deliver)
  Mailer.should_receive(:job_application).with(@job.id,
@user.id).and_return(message)

---

I turned the latter example into a matcher for RSpec 2 and I'm open
for feedback.

Here's a gist incase the inline formatting sucks: https://gist.github.com/798513

RSpec::Matchers.define :deliver do |message|
  chain :with do |*args|
    @with = args
  end

  match do |mailer|
    mail = double
    mail.should_receive(:deliver)

    mailer.should_receive(message).with(*@with).and_return(mail)
  end
end

Mailer.should deliver(:job_application).with(@job.id, @user.id)

---

Is this a sane approach?  Would it have been better to adapt the
Mailer interface to comply with the specs?

Best,
Michael Guterl


More information about the rspec-users mailing list