Hi there,
I was look for a little advice really. I’ve been using RSpec for about 4
months now and I find it an absolute joy for model work and a really
nice tool it makes everything so much more readable and nicer to
organise
However, I seem to dread spec-ing out controllers, they end up being
quite untidy, I think maybe I am approaching them in the wrong way as it
probably shouldn’t be as hard as I am making it.
For example I had a problem over the past few days where I am creating a
way of logging in a customer to our site through a token. There is a
UserController, the customer does a get to the action token_login, we
authenticate the token, check a few other things and then set a session
variable to keep them logged in.
-----8<----------------
it “should find a single sign on” do
mock_user(:generate_security_token => ‘newtoken’)
ms = mock_model(MusicService, :users => [mock_user])
sso = mock_model(SingleSignOn, :music_service => ms)
SingleSignOn.should_receive(:find_by_secret_and_remote_host).with(@secret,
@remote_host).and_return(sso)
ms.users.stub!(:find_by_email).and_return(mock_user)
post :request_token, :secret => @secret, :email_address =>
@email
assigns(:single_sign_on).should equal(sso)
end
-----8<-----------------------
To be honest I feel very uncomfortable about the way this is arranged as
I am mocking several objects and their associations. I am trying to
stick to the “don’t touch the database” way of testing for controllers
and I feel that I am almost writing the implementation in the test just
by the way I am mocking / stubbing and therefore it makes the test
pointless as its just a confirmation of how I’ve written it.
Can anyone give me any ideas of how to do this properly?
How far do you go do you go with your mocking?
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 then don’t feel
comfortable because this approach would be as a reaction to making the
test simpler rather than making the controller code work which is the
whole point of the test.
Any help would be greatly appreciated. Cheers.
RobL