【发布时间】:2020-10-09 18:06:55
【问题描述】:
我有以下(简化的)代码:
def get_redis()
return redis_instance
def bar(key, value, redis=get_redis())
redis.set(key, value)
def foo()
bar("key", value)
在我的测试中,我想模拟函数get_redis 以返回fakeredis.FakeStrictRedis() 的实例,所以我这样做了
def test_foo(mocker):
mocker.patch("app.main.get_redis", return_value=fakeredis.FakeStrictRedis())
foo()
模拟函数无效,foo 函数尝试使用 main 中的 get_redis 函数连接到真正的 redis。
如果我这样写就行了
def bar(key, value)
redis=get_redis()
redis.set(key, value)
这可行,但我可以将 redis 作为默认值传递。如何模拟?
【问题讨论】:
-
我根本不会嘲笑。
foo需要一个 Redis 实例,如果只是传递给bar,所以将其设为参数。然后你可以简单地将你的假实例作为参数传递,而不是修补任何东西。 -
我无法将 redis 实例传递给
foo,因为它是 RPC 方法 -
我猜另一种方法是创建一个redis的全局变量。
标签: python python-unittest python-mock pytest-mock