On 21 Oct 2008, at 10:45, Rob Lacey wrote:

I almost am tempted to simplify the controller by using only the User model and moving most of the checks out of the controller action entirely and putting all into User, although that would mean that the user model, single_sign_on and music_service would then be really tightly coupled which wouldn't be great either. I


The "Rails Way" (assuming you are using Rails) is to make your controllers do virtually nothing - find/create an object, call a method on it, decide which view to render and that's it. So, actually what you suggest would be best.

However, rather than talking to your models directly, the controller could talk to a "presenter" object, which does the "glue work" (finding the associated models, calling the relevant methods in the correct order and packaging up the results) - you can then RSpec your presenter in the same way as you would a model.

This makes your controller specs (and implementations) trivial:

it "should find a single sign-on" do
        @presenter = mock 'SingleSignOnPresenter'
@presenter.should_receive(:request_token).with(secret, email_address).and_return(:whatever)

post :request_token, :secret => 'secret', :email_address => '[EMAIL PROTECTED] '

        response.should redirect_to(some_path)
end

I actually use helpers (given_a_single_sign_on_presenter and expect_to_request_a_token) instead of setting up the mocks and expectations within the spec, just to make it a bit more readable.

Then you can RSpec your SingleSignOnPresenter separately, in much the same way as you would spec a model, and keep the associations (and implementation details) away from your controller.

Baz.

Rahoul Baruah
Web design and development: http://www.3hv.co.uk/
Nottingham Forest: http://www.eighteensixtyfive.co.uk/
Serious Rails Hosting: http://www.brightbox.co.uk/
Lifecast: http://www.madeofstone.net/






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

Reply via email to