mock @patch不修补redis类

时间:2015-03-04 19:24:11

标签: python-3.x redis mocking

我试图使用mockredis模拟redis类,如下所示。但原来的redis类没有被掩盖。

test_hitcount.py

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()

hitcount.py

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))

我在哪里犯了错误?

3 个答案:

答案 0 :(得分:4)

当您import hitcount模块构建redis.StrictRedis()对象并将其分配给r时。在此importredis.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

然后它奏效了。