On Jan 26, 2011, at 7:34 AM, Rob Aldred wrote:

> I'm having a bit of trouble stubbing out a method on a model which has some 
> quite specific behaviour.
> Basically I want to check the method returns something different after ive 
> called update_attributes
> 
> eg.
> 
> @exam.draft?  (returns true)
> @exam.update_attributes(params[:exam])  # sets draft to false
> @exam.draft?  (returns false)

You're testing the framework here. Why?

> To give this some context, if the exam is a draft and update_attributes sets 
> draft to false
> then we want to redirect to the show view instead of edit because only exams 
> that are draft can be edited.
> 
> if @exam.draft?
>       @exam.update_attributes param[:exam]
> end
> 
> if @exam.draft?
>       redirect_to :action => :edit
> else
>       redirect_to :action => :show
> end
> 
> I can obviously set consecutive values with and_return(true,false)
> but this feels a bit unreliable? maybe im just confusing myself

My first question is why the update_attributes needs to be conditional? 
Couldn't you just do:

@exam.update_attributes param[:exam]

if @exam.draft?
        redirect_to :action => :edit
else
        redirect_to :action => :show
end

If it must be the way you have it, I wouldn't do this with stubs on the @exam 
itself. I'd do what you need to do to set the exam in a draft state 
(Factory(:exam, :draft => true)???), and then invoke the controller action with 
:draft => true in one example, and :draft => false in the other.

That make sense?
  

_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to