I''m in the process of migrating from Rails 2 with rspec 1 to Rails 3 with rspec 2, the process has been going pretty well, however, today I came across an issue that I wanted to share. I have a controller that sends out an email through a mailer. Rails 2 code: CurriculumCommentMailer.deliver_comment_update(@curriculum_comment, "created") Rails 3 code: CurriculumCommentMailer.comment_update(@curriculum_comment, "created").deliver In my controller spec, I test to see if the email was sent out. Rspec 1 it "emails the comment" do CurriculumCommentMailer.should_receive(:deliver_comment_update) post :create, :curriculum_comment => @curriculum_comment.attributes end Rspec 2 In my opinion, I expected the following code to work it "emails the comment" do CurriculumCommentMailer.should_receive(:comment_update) post :create, :curriculum_comment => @curriculum_comment.attributes end However it does not. Since I''m calling should_receive on an object that isn''t a stub/mock/double, I expected should_receive to call the underlying code, it does not so .deliver is called on a NilClass. (undefined method `deliver'' for nil:NilClass) The following code does work mailer = double("mailer") mailer.stub(:deliver) CurriculumCommentMailer.should_receive(:comment_update).and_return(mailer) Whereas I expected this code to work, but it does not either CurriculumCommentMailer.should_receive(:comment_update).and_return(double("mailer").stub(:deliver)) thanks for your advice, Todd -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://rubyforge.org/pipermail/rspec-users/attachments/20110727/c996b146/attachment.html>
On 27 July 2011 18:09, Todd Sedano <todd.sedano at sv.cmu.edu> wrote:> I have a controller that sends out an email through a mailer. > Rails 2 > code:?CurriculumCommentMailer.deliver_comment_update(@curriculum_comment, > "created") > Rails 3 code:?CurriculumCommentMailer.comment_update(@curriculum_comment, > "created").deliver > ?In my controller spec, I test to see if the email was sent out. > Rspec 1 > ?? ? ? ?it "emails the comment" do > ?? ? ? ? ?CurriculumCommentMailer.should_receive(:deliver_comment_update) > ?? ? ? ? ?post :create, :curriculum_comment => > @curriculum_comment.attributes > ?? ? ? ?end > Rspec 2 > In my opinion, I expected the following code to work > ?? ? ? it "emails the comment" do > ?? ? ? ? ?CurriculumCommentMailer.should_receive(:comment_update) > ?? ? ? ? ?post :create, :curriculum_comment => > @curriculum_comment.attributes > ?? ? ? ?end > However it does not. Since I''m calling should_receive on an object that > isn''t a stub/mock/double, I expected should_receive to call the underlying > code, it does not so .deliver is called on a NilClass.?(undefined method > `deliver'' for nil:NilClass)You''re right -- #should_receive stubs out the object''s underlying code, so it never gets called.> The following code does work > ?? ? ? ? ?mailer = double("mailer") > ?? ? ? ? ?mailer.stub(:deliver) > > ?CurriculumCommentMailer.should_receive(:comment_update).and_return(mailer) > Whereas I expected this code to work, but it does not either > > ?CurriculumCommentMailer.should_receive(:comment_update).and_return(double("mailer").stub(:deliver))That''s odd -- I would expect that second version to work if the first version is working. What error did you get? Was it the same "undefined method `deliver'' for nil:NilClass" as before? Chris
Chris M. wrote in post #1014770:>CurriculumCommentMailer.should_receive(:comment_update).and_return(double("mailer").stub(:deliver)) > > That''s odd -- I would expect that second version to work if the first > version is working. What error did you get? Was it the same "undefined > method `deliver'' for nil:NilClass" as before?It was giving this error: NoMethodError: undefined method `deliver'' for #<RSpec::Mocks::MessageExpectation:0x10542bb88> But, I changed the test to this and it works fine: CurriculumCommentMailer.should_receive(:comment_update).and_return(double("mailer", :deliver => true)) -Jason -- Posted via http://www.ruby-forum.com/.
On 16 Aug 2011, at 17:30, Jason R. wrote:> Chris M. wrote in post #1014770: >> CurriculumCommentMailer.should_receive(:comment_update).and_return(double("mailer").stub(:deliver)) >> >> That''s odd -- I would expect that second version to work if the first >> version is working. What error did you get? Was it the same "undefined >> method `deliver'' for nil:NilClass" as before? > > It was giving this error: > NoMethodError: undefined method `deliver'' for > #<RSpec::Mocks::MessageExpectation:0x10542bb88> > > But, I changed the test to this and it works fine: > CurriculumCommentMailer.should_receive(:comment_update).and_return(double("mailer", > :deliver => true))Ah, of course! Because #stub doesn''t return the object whose method you''re stubbing, it returns a message expectation. I should have spotted that? Chris