Hi all, I am writing an action mailer test and am trying to snatch contents of the @body hash provided for the template for testing. Specifically, my plan is to do something like: FooMailer.class_eval do attr_accessor :original_body def render_message method, body self.original_body = body super method, body end end and then test that a FooMailer instance has its original_body setup correctly (together with to, from and other headers). However, I noticed that ActionMailer::Base goes out of its way to prevent instantiating mailer objects. Why does it do that? Thanks, Dmitry PS I realize that usual approach is just use pattern matching for the resulting TMail body. However such method seems to strongly couple the test to the email body template (e.g. I may setup the body[:profile] but the email resulting body may only contain the @profile.name, so the test has to know that the template renders just the name and change if the template changes) --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Email templates change very rarely on my project, so I don''t mind the usual approach of matching the body against a few patterns. And, it''s easy to do. Anyway, here''s an example spec of a mailer on my current project: describe Mailer, "job application submitted" do before(:each) do @user = stub(:full_name => "Jane Roe", :email_address => " user-hcDgGtZH8xNBDgjK7y7TUQ@public.gmane.org") @applicant = stub(:full_name => "john doe", :user => @user) @assessment_url = "http://www.example.com" @email = Mailer.create_job_application_submitted(@applicant, @assessment_url) end it "addresses the email from the support address" do @email.from.should == ["support-akIgBECztJRBDgjK7y7TUQ@public.gmane.org"] end it "addresses the email to the given user" do @email.to.should == [@user.email_address] end it "sets the subject" do @email.subject.should == "#{@applicant.full_name.titleize} - Job application submitted" end it "includes the applicant name in the body" do @email.body.should match(/#{@applicant.full_name.titleize}/) end it "includes the applicant''s assessment link in the body" do @email.body.should match(/#{@assessment_url}/) end end Hope that helps somehow. Also, the Rails Guides site has some content on testing mailers: http://guides.rails.info/testing_rails_applications.html#_testing_your_mailers. Regards, Craig --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Thanks for the reply! Your solution works, but it is pretty much same as just doing assert_matches. After some thinking I realized that I can just stub out the render_message of the ActionMailer::Base class: context "Email body hash" do setup do @bar = Bar.create! FooMailer.any_instance.stubs(:render_message).with { |template, body| @body_hash = body}.returns(:email_body) @email = FooMailler.create_send_foo(@bar) end should "contain key pair :bar => @bar" do assert_equal @bar, @body_hash[:bar] end end And that seems to do the trick. I am still quite curious as to why ActionMailer::Base is so set against having instances, but at least it works. Dmitry On Dec 9, 2:17 pm, "Craig Demyanovich" <cdemyanov...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Email templates change very rarely on my project, so I don''t mind the usual > approach of matching the body against a few patterns. And, it''s easy to do. > Anyway, here''s an example spec of a mailer on my current project: > > describe Mailer, "job application submitted" do > > before(:each) do > @user = stub(:full_name => "Jane Roe", :email_address => " > u...-hcDgGtZH8xNBDgjK7y7TUQ@public.gmane.org") > @applicant = stub(:full_name => "john doe", :user => @user) > @assessment_url = "http://www.example.com" > @email = Mailer.create_job_application_submitted(@applicant, > @assessment_url) > end > > it "addresses the email from the support address" do > @email.from.should == ["supp...-akIgBECztJRBDgjK7y7TUQ@public.gmane.org"] > end > > it "addresses the email to the given user" do > @email.to.should == [@user.email_address] > end > > it "sets the subject" do > @email.subject.should == "#...@applicant.full_name.titleize} - Job > application submitted" > end > > it "includes the applicant name in the body" do > @email.body.should match(/...@applicant.full_name.titleize}/) > end > > it "includes the applicant''s assessment link in the body" do > @email.body.should match(/#{@assessment_url}/) > end > > end > > Hope that helps somehow. > > Also, the Rails Guides site has some content on testing mailers:http://guides.rails.info/testing_rails_applications.html#_testing_you.... > > Regards, > Craig--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---