[rspec-users] Problem spec'ing ActionMailer with attachment, body not getting rendered.

Rick DeNatale rick.denatale at gmail.com
Sat Mar 21 16:47:55 EDT 2009


On Fri, Mar 20, 2009 at 11:46 AM, Zach Dennis <zach.dennis at gmail.com> wrote:

> On Fri, Mar 20, 2009 at 11:11 AM, Zach Dennis <zach.dennis at gmail.com>
> wrote:
> > 2009/3/18 Rick DeNatale <rick.denatale at gmail.com>:
> >> I've got a simple ActionMailer::Base subclass:
> >> class InfoMailer < ActionMailer::Base
> >>
> >>     def info(user, zip_name)
> >>     recipients user.email
> >>     subject "Requested Info"
> >>     attachment(:content_type => "application/zip",
> >>                 :filename => zip_name,
> >>                 :body => File.read(zip_name))
> >>     body(:message => "Here is the Info that you Requested")
> >>   end
> >> end
> >> I'm trying to spec this
> >> following
> http://www.rubytutorials.net/2008/02/26/small-rspec-revelations-actionmailer/
> >> describe AssetsInfoMailer do
> >>   before(:each) do
> >>     @user = mock_model(User,
> >>         :email => @user_email = "somewhere at over.the.rainbow",
> >>         :full_name => "The Wicked Witch of the West"
> >>         )
> >>     ActionMailer::Base.delivery_method = :test
> >>     ActionMailer::Base.perform_deliveries = true
> >>     ActionMailer::Base.deliveries = []
> >>   end
> >>   describe ".info" do
> >>     before(:each) do
> >>       @path = 'xyz.zip'
> >>       @attachment_body = 'zip_file_contents'
> >>       File.stub!(:read).and_return(@attachment_body)
> >>       @the_mail = AssetsInfoMailer.deliver_info(@user, at path)
> >>       @attachments = @the_mail.attachments
> >>     end
> >>
> >>     it "should have the right body" do
> >>       @the_mail.body.should == ""
> >>     end
> >>   end
> >> The expectation of an empty string is just to see what's actually
> getting
> >> returned, the result is:
> >> 1)
> >> 'AssetsInfoMailer.info should have the right body' FAILED
> >> expected: "",
> >>      got: "Attachment: xyz.zip\n" (using ==)
> >> It's looking like the mail template never got rendered, and body is
> giving
> >> me the attachment since it's the only part.
> >> I've got one other mailer method in that mailer which doesn't contain an
> >> attachement, and it's body comes out fine.
> >> I'm not sure what's going on here, and I'd appreciate any
> >> help/insight/condolences...
> >>
> >
> > When sending attachments emails are sent as multipart messages. The
> > only part being specified is the attachment. The other call to "body"
> > is being ignored. Try something like:
> >
> > def info(user, zip_name)
> >  recipients user.email
> >  subject "Requested Info"
> >  attachment(:content_type => "application/zip",
> >              :filename => zip_name,
> >              :body => File.read(zip_name))
> >  part "text/plain" do |p|
> >    p.body(:message => "Here is the Info that you Requested")
> >  end
> > end
>
> I just tried my out, and while it does work because there are multiple
> parts specified, also re-ordering of the initial #body to come before
> the attachment doesn't seem to help with the original code either.
>
> I'm curious now what you do find out and which route you decide to go,
> keep us posted either way Rick.


I ende up with pretty much the above, but with

   p.body(render_message('info', :message =>...

since there was a template to render.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://rubyforge.org/pipermail/rspec-users/attachments/20090321/30867f73/attachment-0001.html>


More information about the rspec-users mailing list