用于为应用程序编写单元测试的模拟 redis

我有一个 flask 应用程序,其中我将“烧瓶缓存”与 redis 一起使用。我在缓存中保存一些值并检索它以进行处理。我必须为此编写单元测试。如何模拟 redis 实例并在烧瓶缓存配置中传递该服务器的主机。

我确实尝试过“fakeredis”,但这并没有给我 redis 主机,我可以在烧瓶缓存中使用它并测试我的应用程序。

我该如何为此编写单元测试用例?

def func_1():
    # some steps
    x = func2() # this is where the code for flask caching (redis) data retrieval is
    # process x

我必须测试 func_1()

xy2100789 回答:用于为应用程序编写单元测试的模拟 redis

mock object library 可用于为 Redis 创建 Mock 实例,returns a value 用于特定方法调用,例如:

from unittest.mock import Mock

def test_redis():
    mock_redis = Mock()
    mock_redis.get.return_value = "2020-12-31T00:00:00".encode()

    function_to_test(mock_redis)

如果需要模拟一个函数,使得该函数不被实际调用,而是在被测试的函数内部使用,则可以使用patch decorator,如下所示:

from unittest.mock import patch

@patch("package.module.function_to_mock")
def test_redis(mock_function_to_mock):
    mock_function_to_mock.get.return_value = "2020-12-31T00:00:00".encode()

    function_to_test()

这可用于模拟您正在测试的函数内的烧瓶缓存相关代码。


编辑

对于您的情况,我相信您可能需要执行以下操作:

from unittest.mock import patch

@patch("package.module.func2")
def test_func_1(mock_func2):
    mock_func2.return_value = "Test value"

    func_1()

    mock_func2.assert_called_once()

这里 func2() 是模拟的,它的返回值设置为 "Test value",所以当它在 func_1() 变量内部调用时,x 等于 "Test value">

注意:传递给 patch() 的路径必须是导入 func2() 的位置,而不是定义 func2() 的模块。

本文链接:https://www.f2er.com/1174661.html

大家都在问