Python spöttische Drittanbieter-Module

Ich versuche, einige Klassen zu testen, die Tweets verarbeiten. Im mit sixohsix twitter, um mit Twitter-API umzugehen. Ich habe eine Klasse, die als Fassade für die Twitter-Klassen fungiert, und meine Idee war, die tatsächlichen sixohsix Klassen zu verspotten, um die Ankunft von Tweets zu simulieren, indem sie zufällig neue Tweets erzeugen oder sie aus einer Datenbank abholen.

Meine Fassade sieht so aus wie:

from twitter import TwitterStream class TwitterFacade(object): def __init__(self, dev='soom'): self._auth = OAuth(dev_keys["ACCESS_TOKEN"], dev_keys["ACCESS_SECRET"], dev_keys["CONSUMER_KEY"], dev_keys["CONSUMER_SECRET"]) def tweets(self, callback=None, users=[], terms=[], locations=[], count=5): t = TwitterStream(auth=self._auth) args = {} if users: args['follow'] = ",".join(users) if terms: args['track'] = ",".join(terms) if locations: args['locations'] = ",".join(str(l) for l in locations) # this controls the general loop, it re-enters if there was an exception, # otherwise the for loop should take care of looping trough the tweets cant = count while cant > 0: try: iterator = t.statuses.filter(**args) for twit in iterator: if twit.get('text'): callback(twit) cant -= 1 if cant == 0: iterator.close() break except Exception as e: print e #some error handling code 

Also, wenn in einem Unbekannten möchte ich ein Modul testen, das etwas mit den Tweets macht, wie würde ich die TwitterStream-Klasse verspotten? Ich habe versucht, Mock zu benutzen:

 from mock import patch from twitter_facade import TwitterFacade class TwitterStreamProxy(object): def __init__(self): pass #some code for dealing with statuses.filter(..) @patch('twitter.TwitterStream', TwitterStreamProxy()) def test_filter_on_tweets(): facade = TwitterFacade() facade.tweets(somemethod, [], ['term1', 'term2'], [], count=50) def somemethod(tweet): #some logic in here 

Das funktioniert nicht, twitter api ist noch angerufen. Ich hätte erwartet, dass sincen ich didnt fügen Sie alle Code, um die Mock-Klasse hätte ich einen Fehler oder etwas bekommen, aber sixohsix twitter Klassen wo angerufen statt.

One Solution collect form web for “Python spöttische Drittanbieter-Module”

Sie müssen das lokale Objekt patch; Ihr Modul hat einen Verweis auf das TwitterStream Objekt, Patch, dass:

 @patch('yourmodule.TwitterStream', TwitterStreamProxy()) 

Sehen Sie die Mock Wo zu Patch Dokumentation.

  • Testen auf Nebenwirkungen in Python
  • Überspringen aller Unit-Tests, aber eine in Python mit Dekorateure und Metaklassen
  • Einheit testet ganze Projekthierarchie in Python mit unittest in pydev
  • Verwenden von Unbekanntem, um argparse zu testen - Austrittsfehler
  • Wie man Firefox-Profil mit Selen umschaltet - ohne einen neuen Treiber zu benennen?
  • Verwenden von unittest.mock zum Patch-Eingabe () in Python 3
  • Speziell benannte Verzeichnisse mit Nosetests
  • Testen eines Python-API-Clients
  • Python ist die beste Programmiersprache der Welt.