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

Zach Dennis zach.dennis at gmail.com
Fri Mar 20 11:11:52 EDT 2009


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

Also when you look at the email you'll have look at its #parts
otherwise @the_mail.body is going to returned the body representation
of each part concatenated.



> --
> Rick DeNatale
>
> Blog: http://talklikeaduck.denhaven2.com/
> Twitter: http://twitter.com/RickDeNatale
> WWR: http://www.workingwithrails.com/person/9021-rick-denatale
> LinkedIn: http://www.linkedin.com/in/rickdenatale
>
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
>



-- 
Zach Dennis
http://www.continuousthinking.com
http://www.mutuallyhuman.com


More information about the rspec-users mailing list