2010-11-17 5 views
0

J'essaie de tester une action de contrôleur sur Rails 2.3.10 qui se connectent à Google pour récupérer des contacts. J'utilise Rspec et Mocha pour tester. Je veux remplacer l'appel réel à Google puisqu'il s'agit d'un test unitaire. Je veux vérifier que la méthode authsub_url est appelée avec les paramètres corrects. Cesser la méthode provoque l'échec de l'attente.RSpec Google Contacts Connexion

Tout conseil serait apprécié.

Merci!

Ma méthode qui met en place le client Google est ci-dessous:

def setup_client 
    @client = GData::Client::DocList.new(:authsub_scope => CONTACTS_SCOPE, :source => 'google-DocListManager-v1.1', :version => '3.0')  

    if params[:token].nil? && session[:google_token].nil? 
     @authsub_link = @client.authsub_url(import_method_gmail_url, false, true) 
     render :action => :index, :layout => "empty" 
    elsif params[:token] && session[:google_token].nil? 
     @client.authsub_token = params[:token] 
     session[:google_token] = @client.auth_handler.upgrade 
    end 

    @client.authsub_token = session[:google_token] if session[:google_token] 
    end 

Voici mon test:

describe "setup_client" do 
    it "has a authsub_link if there is no token parameter and the google token is not present in the session" do 
     GData::Client::DocList.any_instance.stubs(:authsub_url).returns("http://test.google.com/contacts") 
     user = Factory(:subscriber_user) 
     profile = Factory(:profile, :user => user) 
     login_as user 

     controller.instance_variable_get(:@client).expects(:authsub_url).with(import_method_gmail_url, false, true).once 

     get :index 

     assigns(:authsub_link).should == "http://test.google.com/contacts" 
    end 
    end 

Répondre

0

Je recommande FakeWeb. Cela vous permet de simuler des requêtes Web. Définissez simplement l'URL que vous appelez et préparez la ou les réponses. Rend votre vie très facile.

0

Il semble que vous Déraciner la méthode DocList#authsub_url en deux endroits: -

Le premier talon est une instance de DocList et renvoie une URL: -

GData::Client::DocList.any_instance.stubs(:authsub_url).returns("http://test.google.com/contacts") 

Le second tronçon est sur l'instance réelle de DocList mais cela revient nil parce qu'aucun il n'y a pas de clause returns: -

controller.instance_variable_get(:@client).expects(:authsub_url).with(import_method_gmail_url, false, true).once 

Je pense que vous pouvez obtenir ce que vous voulez en les combinant quelque chose comme ceci: -

controller.instance_variable_get(:@client).expects(:authsub_url).with(import_method_gmail_url, false, true).returns("http://test.google.com/contacts") 

Notez que once est la valeur par défaut est donc nécessaire à moins que vous ne voulez souligner que la méthode ne doit être appelée une fois.

Questions connexes