I have this function in my controller:
def open_id_authentication(openid_url)
authenticate_with_open_id(openid_url, :required => [:nickname,
:email], :optional => [:fullname]) do |result, identity_url,
registration|
if result.successful?
@user = User.find_or_initialize_by_identity_url(identity_url)
if @user.new_record?
@user.login = registration['nickname']
@user.fullname = registration['fullname']
@user.email = registration['email']
@user.save!
@user.activate
end
self.current_user = @user
successful_login
else
failed_login result.message, 'openid'
end
end
end
I tried to make a stub but with no success, maybe because it's a
block. Any hint about that one please?
Thanks in advance
Pat
on 29.04.2008 18:02
on 29.04.2008 18:46
On 29 Apr 2008, at 17:00, Patrick Aljord wrote: > I tried to make a stub but with no success, maybe because it's a > block. Any hint about that one please? What are you trying to stub? Are you trying to stub authenticate_with_open_id? > def open_id_authentication(openid_url) > authenticate_with_open_id(openid_url, :required => [:nickname, > :email], :optional => [:fullname]) do |result, identity_url, > registration| > if result.successful? > @user = User.find_or_initialize_by_identity_url(identity_url) > ... > end > end > end If so, you could try controller.stub! (:authenticate_with_open_id ).and_yield(:result, :identity_url, :registration) so that the code in the block actually gets run (a normal stub, or one with and_return with simply eat the block). Obviously, make sure that it's yielding the values you want it to. HTH Matt -- Matt Patterson | Design & Code <matt at reprocessed org> | http://www.reprocessed.org/
on 30.04.2008 08:01
ok thanks, I still get a "undefined method `successful?'", successful? is a method that is used inside of the block, it's partof the open_id_authentication plugin, any way to include the plugin in the spec so that it recognizes the method? thanks in advance Pat
on 30.04.2008 15:23
If you used Matt's code below, then successful? is most likely referring to a method after your open_id_authentication method. When you stub! that method you're effectively telling rspec to skip over it and return what I tell you instead. You'd need to paste more of your spec and controller action that you're stubbing for anyone to be of further help.
on 30.04.2008 18:33
> You'd need to paste more of your spec and controller action that you're > stubbing for anyone to be of further help. > I think I posted it on my first post, here it is: def open_id_authentication(openid_url) authenticate_with_open_id(openid_url, :required => [:nickname, :email], :optional => [:fullname]) do |result, identity_url, registration| if result.successful? @user = User.find_or_initialize_by_identity_url(identity_url) if @user.new_record? @user.login = registration['nickname'] @user.fullname = registration['fullname'] @user.email = registration['email'] @user.save! @user.activate end self.current_user = @user successful_login else failed_login result.message, 'openid' end end end My spec looks like this: it "should login with openid and redirect" do openid_url = "patcito.myopenid.com" controller.stub!(:using_open_id?).and_return(true) controller.stub!(:authenticate_with_open_id).and_yield(result,openid_url,registration={"nickname"=>"patcito","email"=>"bob@gmail.com","fullname"=>'bobby bob'}) post :create, :openid_url => openid_url session[:user_id].should_not be(nil) response.should be_redirect end I tried to do something similar to this http://pastie.textmate.org/102377 but it complains that OpenID::Consumer::SUCCESS is not recognized. I guess I'd have to include my open_id_authentication plugin lib in my spec to get it recognized no? is there another way to include a lib in my spec to make it work? thanks in advance Pat
on 06.05.2008 07:13
On Wed, 2008-04-30 at 11:26 -0500, Patrick Aljord wrote: > My spec looks like this: > it "should login with openid and redirect" do > openid_url = "patcito.myopenid.com" > controller.stub!(:using_open_id?).and_return(true) > controller.stub!(:authenticate_with_open_id).and_yield(result,openid_url,registration={"nickname"=>"patcito","email"=>"bob@gmail.com","fullname"=>'bobby > bob'}) > post :create, :openid_url => openid_url > session[:user_id].should_not be(nil) > response.should be_redirect > end result is not defined, so the successful? method isn't known. I'd create a mock for it and stub! that method. result = mock('openid result') result.stub!(:successful?).and_return(true) You can then use result.should_receive(:successful?) in subsequent specs to describe what happens if the result of the call is and isn't successful. Kind regards, Hans