Ruby Forum RSpec > another noob question about stubs

Posted by Patrick Aljord (patcito)
on 29.04.2008 18:02
(Received via mailing list)
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
Posted by Matt Patterson (Guest)
on 29.04.2008 18:46
(Received via mailing list)
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/
Posted by Patrick Aljord (patcito)
on 30.04.2008 08:01
(Received via mailing list)
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
Posted by Bryan Ray (Guest)
on 30.04.2008 15:23
(Received via mailing list)
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.
Posted by Patrick Aljord (patcito)
on 30.04.2008 18:33
(Received via mailing list)
>  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
Posted by Hans de Graaff (Guest)
on 06.05.2008 07:13
(Received via mailing list)
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