我试图使用mockredis模拟redis类,如下所示。但原来的redis类没有被掩盖。
import unittest
from mock import patch
import mockredis
import hitcount
class HitCountTest(unittest.TestCase):
@patch('redis.StrictRedis', mockredis.mock_strict_redis_client)
def testOneHit(self):
# increase the hit count for user peter
hitcount.hit("pr")
# ensure that the hit count for peter is just 1
self.assertEqual(b'0', hitcount.getHit("pr"))
if __name__ == '__main__':
unittest.main()
import redis
r = redis.StrictRedis(host='0.0.0.0', port=6379, db=0)
def hit(key):
r.incr(key)
def getHit(key):
return (r.get(key))
我在哪里犯了错误?
答案 0 :(得分:4)
当您import hitcount
模块构建redis.StrictRedis()
对象并将其分配给r
时。在此import
个redis.StrictRedis
类的每个补丁对r
引用无法生效后,至少可以修补一些redis.StrictRedis
方法。
所以你需要做的是补丁hitcount.r
实例。跟随(未经测试的)代码通过将hitcount.r
实例替换为您想要的模拟对象来完成工作:
@patch('hitcount.r', mockredis.mock_strict_redis_client(host='0.0.0.0', port=6379, db=0))
def testOneHit(self):
# increase the hit count for user peter
hitcount.hit("pr")
# ensure that the hit count for peter is just 1
self.assertEqual(b'0', hitcount.getHit("pr"))
答案 1 :(得分:0)
您需要修补在hitcount
中导入的确切内容。
因此,如果您在import redis
中导入了hitcount
,那么您需要@patch('hitcount.redis.StrictRedis')
。
如果您导入from redis import StrictRedis
,则需要@patch('hitcount.StrictRedis')
。
答案 2 :(得分:0)
我也是同一个问题。我所做的是从我的机器上卸载所有旧版本的python。我只使用python3,它工作。 sudo apt-get删除python2.7 我安装了以下内容 sudo easy_install3点子 sudo apt-get install python3-setuptools
然后它奏效了。