[rspec-users] Factories vs. stubs/mocks

Justin Ko jko170 at gmail.com
Mon Aug 30 12:17:11 EDT 2010



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.


More information about the rspec-users mailing list