[英]python mocking third party modules
im trying to test some classes that process tweets. 我试图测试一些处理推文的类。 Im using sixohsix twitter to deal with Twitter API. 我使用sixohsix twitter来处理Twitter API。 I have a class that acts as a facade for the Twitter classes, and my idea was to mock the actual sixohsix classes to simulate the arrival of tweets, by randomly generate new tweets or retrieving them from a database. 我有一个类作为Twitter类的外观,我的想法是模拟实际的sixohsix类来模拟推文的到来,通过随机生成新推文或从数据库中检索它们。
My facade looks something like: 我的外观看起来像:
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
So if in an unittest i want to test some module that does something with the tweets, how would i mock the TwitterStream class ? 因此,如果在单元测试中我想测试一些与推文有关的模块,我将如何模拟TwitterStream类? I've tried using Mock: 我尝试过使用Mock:
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
This is not working, twitter api is still been called. 这不行,twitter api仍被调用。 I would have expected that sincen i didnt add any code to the mock class i would have gotten an error or something, but sixohsix twitter classes where called instead. 我原以为,因为我没有添加任何代码到模拟类我会得到一个错误或什么,但六声道的Twitter类调用而不是。
You need to patch the local object ; 你需要修补本地对象 ; your module has a reference to the TwitterStream
object, patch that: 你的模块有一个对TwitterStream
对象的引用,补丁说:
@patch('yourmodule.TwitterStream', TwitterStreamProxy())
See the mock Where to Patch documentation. 请参阅模拟Where to Patch文档。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.