python - Django 模拟补丁无法正常工作

标签 python django unit-testing mocking redis

总结:我正在做一个实验来尝试创建一个简单的模拟来替换 redis。我正在尝试做的事情从代码中应该是显而易见的。简短的版本是,模拟不起作用 - 它仍然会重新分配并创建 key 。

测试.py:

<p></p>

<pre><code>from django.test import TestCase
import mock
from redis_mock.simple_redis_mock import redisMockGetRedis, redisMockFlushDB
from account.util import get_redis

class SimpleTest(TestCase):

    def setUp(self):
        redisMockFlushDB()

    @mock.patch("account.util.get_redis", redisMockGetRedis)
    def test_redis(self):
        key = "hello123"
        value = "world123"
        r = get_redis()
        r.set(key, value)
        value2 = r.get(key)
        self.assertEqual(value, value2)
</code></pre>

<p></p>

实用程序:

import redis

REDIS_HOST = 'localhost'
REDIS_PORT = 6379
REDIS_DEFAULT_DB = 0

def get_redis():
    print "account.util.get_redis"
    return redis.StrictRedis(
        REDIS_HOST, 
        REDIS_PORT, 
        REDIS_DEFAULT_DB
    )

simple_redis_mock.py:

"""
A simple mock for Redis. Just mocks set, get and expire commands.
"""

class SimpleRedisMockDB:
    db = {}

def redisMockFlushDB():
    """
    Helper function to flush the RedisMock db between test runs
    """
    print "redisMockFlushDB"
    SimpleRedisMock.db = {}

class SimpleRedisMock:
    def get(self, key):
        val = None
        try:
            val = SimpleRedisMockDB.db[key]
        except:
            pass
        print "SimpleRedisMock get(" + str(key) + "):" + str(val)
        return val

    def set(self, key, val):
        print "SimpleRedisMock set(" + str(key) + "," + str(val) +")"
        SimpleRedisMockDB.db[key] = val

    def expire(self, key):
        pass


def redisMockGetRedis():
    print "redisMockGetRedis"
    return SimpleRedisMock()

现在,我期望的是,当我运行我的测试时,没有设置任何 redis 键。这是实际发生的事情:

twang$ redis-cli
redis 127.0.0.1:6379> del hello123
(integer) 1
redis 127.0.0.1:6379> exit
twang$ ./manage.py test account
Creating test database for alias 'default'...
redisMockFlushDB
account.util.get_redis
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK
Destroying test database for alias 'default'...
twang$ redis-cli
redis 127.0.0.1:6379> get hello123
"world123"

简单的问题:为什么 mock.patch 没有按照我的预期进行?

最佳答案

链接

http://www.voidspace.org.uk/python/mock/patch.html#where-to-patch

帮助我更好地理解如何在 python 中修补函数调用。

关于python - Django 模拟补丁无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15352315/

相关文章:

python - 属性错误 :split on spark sql python using lambda

python - 如何为 Python Telegram Bot 创建单元测试

java - JUnit 如何测试构造函数?

python - 为类中的方法实现就地操作

Python:为什么缺陷查找器模块在cmd窗口中不起作用?

python - Tensorflow:如何创建混淆矩阵

java - 为什么通过扩展类来测试类被认为是一种不好的做法?

python - 提交空表格和奇怪的输出

javascript - 两个不同的ajax url返回相同的数据

django - 如何在 django Rest Framework 和 docker 中设置 prometheus