【问题标题】:Mock redis for writing unittest for application模拟 redis 为应用程序编写单元测试
【发布时间】:2021-04-07 17:18:43
【问题描述】:

我有一个烧瓶应用程序,我在其中使用带有 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()

【问题讨论】:

  • 模拟出对 redis 的调用并断言在模拟上调用了正确的方法
  • 我必须测试的函数之一有与烧瓶缓存相关的代码,用于检索和处理数据。因此,我将无法为此编写单元测试。没有不同的功能来检索 redis 数据。

标签: python unit-testing redis pytest flask-caching


【解决方案1】:

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() 的模块。

【讨论】:

  • 你能请。解释第二个例子中function_to_mock和mock_function_to_mock的区别?
  • @Simplecode function_to_mock 是要模拟的目标函数,因此实际上并未调用它。我相信你的情况function_to_mockfunc2()mock_function_to_mockpatch()function_to_mock 创建的MagicMock 实例。换句话说,patch()function_to_mock 替换为MagicMock 实例,然后通过mock_function_to_mock 参数将其传递给测试函数test_redis()mock_function_to_mock 然后可用于指定返回值。
  • 这个有必要用mock_func2.assert_called_once() ?
  • @Simplecode 没有必要调用mock_func2.assert_called_once(),因为它只检查func2func_1() 内只调用一次。如果你不想检查这个,那么它可以被忽略。
猜你喜欢
  • 1970-01-01
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 2021-12-29
  • 1970-01-01
相关资源
最近更新 更多