David:

Wow, that's just about the perfect example of a coding help forum
reply:

Specifically identifies what's going wrong.
Suggests a simple solution.
Identifies the deeper underlying problem (code that's too bloated,
tightly-coupled, or whatever, and thus hard to test)
Gently offers a detailed approach to address the underlying problem
All without a hint of condescension.

Thank you very much! This will help improve my code in many ways
beyond the present problem.

--Dean


On Jul 10, 6:00 am, 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?
>
> 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), 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 likehttps://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-us...@rubyforge.orghttp://rubyforge.org/mailman/listinfo/rspec-users- 
> Hide quoted text -
>
> - Show quoted text -- Hide quoted text -
>
> - Show quoted text -
_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to