I am trying to write specs for a controller without using fixtures (instead employing mock models). This controller requires a user to be logged in, for which I’m employing AuthLogic, following the author’s recommendations.
describe UsersController do
def mock_user(stubs={})
@mock_user ||= mock_model(User, stubs)
end
context 'when logged in' do
before { activate_authlogic }
it "exposes the logged-in user as @user in response to GET (show)" do
UserSession.create(mock_user)
...
end
...
end
...
end
These examples all fail at the line UserSession.create(...), reporting to the effect of:
Mock 'User_1005' received unexpected message :changed? with (no args)
I’m not sure how to resolve this; is mocking with :changed? => false appropriate?
Iain posted a solution to using mock objects with AuthLogic. To rephrase, the following helpers go into
spec_helpers.rb:I’ve incorporated this into my specs, and I find it does exactly what I was hoping. I have working controller specs that exploy mock models for the logged-in user, so now they don’t all break when I add a field to User. Iain’s example of implementing this in a spec is as:
P.S. I hate to answer my own question, but this is the answer I was looking for; I just didn’t find it early enough.