Hi everyone, I''m trying to write integration tests for my sample twitter app and I''m having trouble mocking out objects in the Twitter namespace. Here''s the function that''s giving me trouble: def build_twitter(omniauth) Twitter.configure do |config| config.consumer_key = TWITTER_KEY config.consumer_secret = TWITTER_SECRET config.oauth_token = omniauth[''credentials''][''token''] config.oauth_token_secret = omniauth[''credentials''][''secret''] end client = Twitter::Client.new user = client.current_user self.name = user.name end and here''s the test: feature ''testing oauth'' do before(:each) do @twitter = double("Twitter") @twitter.stub!(:configure).and_return true @client = double("Twitter::Client") @client.stub!(:current_user).and_return(@user) @user = double("Twitter::User") @user.stub!(:name).and_return("Tester") end scenario ''twitter'' do visit root_path login_with_oauth page.should have_content("Pages#home") end end But, I''m getting this error: Failures: 1) testing oauth twitter Failure/Error: login_with_oauth Twitter::Error::Unauthorized: GET https://api.twitter.com/1/account/verify_credentials.json: 401: Invalid / expired Token # ./app/models/user.rb:40:in `build_twitter'' # ./app/models/user.rb:16:in `build_authentication'' # ./app/controllers/authentications_controller.rb:47:in `create'' # ./spec/support/integration_spec_helper.rb:3:in `login_with_oauth'' # ./spec/integration/twit_test.rb:16:in `block (2 levels) in <top (required)>'' Any ideas on how to make this work? I''m using rspec for mocking the objects but I''m open to mocha if that''s a better choice. Thanks, Andrew -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
On Nov 29, 6:05 pm, spinlock <atomicbroadc...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Hi everyone, > > I''m trying to write integration tests for my sample twitter app and > I''m having trouble mocking out objects in the Twitter namespace. > Here''s the function that''s giving me trouble: > > def build_twitter(omniauth) > Twitter.configure do |config| > config.consumer_key = TWITTER_KEY > config.consumer_secret = TWITTER_SECRET > config.oauth_token = omniauth[''credentials''][''token''] > config.oauth_token_secret = omniauth[''credentials''][''secret''] > end > client = Twitter::Client.new > user = client.current_user > self.name = user.name > end > > and here''s the test: > > feature ''testing oauth'' do > before(:each) do > @twitter = double("Twitter") > @twitter.stub!(:configure).and_return true > @client = double("Twitter::Client") > @client.stub!(:current_user).and_return(@user) > @user = double("Twitter::User") > @user.stub!(:name).and_return("Tester") > end >You''re creating @twitter, stubbing configure on it and so on, but the code under test is still calling Twitter.configure. Calling double(''Twitter'') doesn''t replace the existing Twitter constant - you need to do something like Twitter.stub(:configure) (or Twitter.should_receive(...), similarly with Twitter::Client.new and so on Fred> scenario ''twitter'' do > > visit root_path > login_with_oauth > > page.should have_content("Pages#home") > end > end > > But, I''m getting this error: > Failures: > > 1) testing oauth twitter > Failure/Error: login_with_oauth > Twitter::Error::Unauthorized: > GEThttps://api.twitter.com/1/account/verify_credentials.json: > 401: Invalid / expired Token > # ./app/models/user.rb:40:in `build_twitter'' > # ./app/models/user.rb:16:in `build_authentication'' > # ./app/controllers/authentications_controller.rb:47:in `create'' > # ./spec/support/integration_spec_helper.rb:3:in > `login_with_oauth'' > # ./spec/integration/twit_test.rb:16:in `block (2 levels) in <top > (required)>'' > > Any ideas on how to make this work? I''m using rspec for mocking the > objects but I''m open to mocha if that''s a better choice. > > Thanks, > Andrew-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Thank you! I was missing the difference between stubbing a method on the Twitter::Client class vs. instantiating an object via doubling. Once I figured this out, I fixed my tests. On Nov 29, 3:29 pm, Frederick Cheung <frederick.che...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> On Nov 29, 6:05 pm, spinlock <atomicbroadc...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > Hi everyone, > > > I''m trying to write integration tests for my sample twitter app and > > I''m having trouble mocking out objects in the Twitter namespace. > > Here''s the function that''s giving me trouble: > > > def build_twitter(omniauth) > > Twitter.configure do |config| > > config.consumer_key = TWITTER_KEY > > config.consumer_secret = TWITTER_SECRET > > config.oauth_token = omniauth[''credentials''][''token''] > > config.oauth_token_secret = omniauth[''credentials''][''secret''] > > end > > client = Twitter::Client.new > > user = client.current_user > > self.name = user.name > > end > > > and here''s the test: > > > feature ''testing oauth'' do > > before(:each) do > > @twitter = double("Twitter") > > @twitter.stub!(:configure).and_return true > > @client = double("Twitter::Client") > > @client.stub!(:current_user).and_return(@user) > > @user = double("Twitter::User") > > @user.stub!(:name).and_return("Tester") > > end > > You''re creating @twitter, stubbing configure on it and so on, but the > code under test is still calling Twitter.configure. Calling > double(''Twitter'') doesn''t replace the existing Twitter constant - you > need to do something like Twitter.stub(:configure) (or > Twitter.should_receive(...), similarly with Twitter::Client.new and so > on > > Fred > > > scenario ''twitter'' do > > > visit root_path > > login_with_oauth > > > page.should have_content("Pages#home") > > end > > end > > > But, I''m getting this error: > > Failures: > > > 1) testing oauth twitter > > Failure/Error: login_with_oauth > > Twitter::Error::Unauthorized: > > GEThttps://api.twitter.com/1/account/verify_credentials.json: > > 401: Invalid / expired Token > > # ./app/models/user.rb:40:in `build_twitter'' > > # ./app/models/user.rb:16:in `build_authentication'' > > # ./app/controllers/authentications_controller.rb:47:in `create'' > > # ./spec/support/integration_spec_helper.rb:3:in > > `login_with_oauth'' > > # ./spec/integration/twit_test.rb:16:in `block (2 levels) in <top > > (required)>'' > > > Any ideas on how to make this work? I''m using rspec for mocking the > > objects but I''m open to mocha if that''s a better choice. > > > Thanks, > > Andrew-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.