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
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users