On Sun, Jul 10, 2011 at 4:30 PM, David Chelimsky <dchelim...@gmail.com>wrote:
> > On Jul 8, 2011, at 5:37 PM, Dean wrote: > > I'm getting the following RSpec failed test output when I run spec > spec/controllers/macroposts_controller_spec.rb: > > http://pastie.org/2184821 > > Here's the controller code for the "create" action for which the tests are > failing: > > http://pastie.org/2184834 > > And here's the relevant section of the macroposts_controller_spec.rb file: > > http://pastie.org/2184846 > > Finally, here are the factory definitions referenced in the _spec.rb file > given above: > > http://pastie.org/2184863 > > Focusing on failures #1 and #2, it's clear enough from the error messages > that in the "POST create success" path through the specs, the @macropost > object isn't receiving :save. The site has no problem saving macroposts, but > when I run the tests, the "if @macropost.save" line in the controller seems > to never get executed, or the save process is failing silently, perhaps due > to validation problems. > > When I try to walk through the process in the console (in the "test" > environment) I'm able to produce a valid @macropost object that saves. Yet > for some reason, my test specs cannot. > > Any suggestions? Obvious things I've missed? Additional info I can provide? > > > Hi David, > The Project returned by "@project = Project.find(params[:project_id])" in > the controller action is not the same object as the one defined in the spec. > This is going to change in rails-3.1 (if you configure it to use the new > identiy_map feature), > I had the same problem as above, and I used the same solution as you said.i.e. replacing should_receive with stub. However, I never got to understand why it worked. As you said, the objects returned in the spec are different but that is going to change in rails-3.1. Can you elaborate a bit on the details of the change. May be point me to a blog post written over it, and if there's not one now, why not you write yourself one explaining the whole thing, when you find time. BTW, I am a great fan of yours and your blog has helped a lot, learning the basics of TDD by reading your articles and answers here & the rspec forum. but that is the case for all previous versions. > > To get the examples to work as written, you need to add: > > Project.stub(:find).and_return(@project) > > That should get these examples to pass, but there are a number of problems > with the overall approach. > > One reason to use stubs is to isolate yourself from the real models. That > way changes to validation rules, etc, don't cause your controller specs to > fail, and your specs run significantly faster as well. Since these examples > use real models, you're not getting the isolation benefit. > > Additionally, stubbing nested resources like this gets pretty complicated > and difficult to maintain. > > Lastly, the controller action violates "Skinny Controller, Fat Model" [1], > and that is complicating these specs quite a bit. > > With all that, I'd refactor the action to add the project and user IDs to > the macropost hash, just interact with that model only, and move the mailer > logic to an after_save hook on the model. The resulting controller and spec > would look something like https://gist.github.com/1074456. Note that there > is only one stub, and it is dead simple. > > The only thing keeping these examples slow now is the creation of a real > User, but you could probably stub that out as well. > > HTH, > David > > [1] http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model > > > > Thanks! > > Dean Richardson > > > > _______________________________________________ > rspec-users mailing list > rspec-users@rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users >
_______________________________________________ rspec-users mailing list rspec-users@rubyforge.org http://rubyforge.org/mailman/listinfo/rspec-users