[rspec-users] Factories vs. stubs/mocks

Brennon Bortz brennon at brennonbortz.com
Mon Aug 30 12:54:29 EDT 2010


On 30 Aug 2010, at 17:17, Justin Ko wrote:

> 
> 
> On Aug 30, 11:59 am, Brennon Bortz <bren... at brennonbortz.com> wrote:
>> I am, as usual, assigning an instance variable in a controller's index action to find all instances of a model in the database.  I want to write a spec that checks that this variable is assigned correctly.  I can do:
>> 
>> it "should provide a collection of widgets in @widgets" do
>>       widget = Widget.create("title" => "my widget")
>>       get :index
>>       assigns[:widgets].should include(widget)
>> end
>> 
>> or:
>> 
>> it "should provide a collection of widgets in @widgets" do
>>       widget = Factory.create(:widget)
>>       get :index
>>       assigns[:widgets].should include(widget)
>> end
>> 
>> Is there a better way to do this with a mock model, though?
>> 
>> Thanks,
>> 
>> Brennon Bortz
>> Software Researcher
>> Dundalk Institute of Technology
>> brennon.bo... at casala.ie
>> Ph.D. Researcher & Composer - Sonic Arts Research Centre
>> Queen's University, Belfast
>> bren... at brennonbortz.com / bbort... at qub.ac.uk
>> 
>> _______________________________________________
>> rspec-users mailing list
>> rspec-us... at rubyforge.orghttp://rubyforge.org/mailman/listinfo/rspec-users
> 
> Currently, what you're doing is checking that the Widget model returns
> the correct widgets. If you want to isolate your controller spec from
> the model, you must stub or mock the model method call in the action.
> Example:
> 
> it "..." do
>  widget = mock_model(Widget)
>  Widget.should_receive(:all).and_return([widget])
>  get :index
>  assigns[:widgets].should include(widget)
> end
> 
> To check that Widget.all does indeed return the correct widgets, I
> would spec that behaviour in the Widget model spec.
> 
> Hope that helps.

Hrm...that's exactly what I'd started with, and I was getting the following error:

Failures:
  1) WidgetsController GET 'index' should provide a collection of widgets in @widgets
     Failure/Error: assigns[:widgets].should include(widget)
     expected [] to include #<Widget:0x81686290 @name="Widget_1001">

Stupidly, I had defined my controller method as:

def index
  @widgets = Widget.find(:all)
end

Changed that assignment to Widget.all...problem solved.


More information about the rspec-users mailing list