【问题标题】:Python mock patch a coroutine function within another function using pytest?Python模拟使用pytest在另一个函数中修补协程函数?
【发布时间】:2023-03-16 12:18:01
【问题描述】:

我在 module_name/app.py 中有两个函数

async def f1(arg):
    # do something
    return arg + '1'


async def f2(arg):
    result = await f1(arg)
    return result

我尝试使用 pytest 和 asynctest 测试 f2 和模拟 f1。
如果我这样做,它只会起作用

def sf_f1(arg):
    return 'some value'

@pytest.mark.asyncio
async def test_f2():
    with asynctest.mock.patch('module_name.app.f1', side_effect=sf_f1):
        assert 'some value' == await f2('test')

测试通过

但是,我想做这样的事情

import module_name

@pytest.fixture()
def mock_f1():
    return asynctest.CoroutineMock(module_name.app.f1, side_effect=sf_f1)


@pytest.mark.asyncio
async def test_f2_2(mock_f1):
    assert 'some value' == await f2('test')

我明白了

   assert 'some value' == await f2('test')
   AssertionError: assert 'some value' == 'test1'
     - some value
     + test1

为什么第二种方法不起作用?

【问题讨论】:

  • 什么不起作用?您期望的结果是什么,实际结果是什么?
  • 模拟不起作用并且函数 f1 运行。当我想为模拟函数添加返回值或副作用时。
  • 我添加了副作用函数。在第一种情况下,它有效。在第二种情况下,函数 f2 运行,而不是 side_effect 函数。
  • MCVE 在这里真的很有帮助,一个显示你在做什么的代码,然后解释你期望发生的事情。也许将 print 语句放入您希望在使用 mock 时发生的打印的各种函数和状态中。
  • 对不起,这个例子。我在代码中留下了一些更改并添加了断言错误。希望这段代码更完整,更易读。

标签: python pytest python-asyncio


【解决方案1】:

在您的第二个示例中,在 mock_f1 夹具中,您创建一个 CoroutineMock 对象并返回它。但是你不会覆盖module_name.app.f1 函数:Mock 类似的对象不会自动修补任何东西。

这是对您的示例的说明性补充:

@pytest.mark.asyncio
async def test_f2_2(mock_f1):
    print('fixture value:', mock_f1)
    print('actual module_name.app.f1 function:', module_name.app.f1)
    assert 'some value' == await f2('test')

这会打印出这样的想法

fixture value: <CoroutineMock spec='function' id='139756096130688'>
actual module_name.app.f1 function: <function f1 at 0x7f1b7e1139d8>

当您调用f2 时,它使用模块中的f1 函数,该函数不会被覆盖。

这就是你的工作方式:

@pytest.fixture
def mock_f1(monkeypatch):
    fake_f1 = asynctest.CoroutineMock(module_name.app.f1, side_effect=sf_f1)
    monkeypatch.setattr(module_name.app, 'f1', fake_f1)
    return fake_f1

您可能知道,monkeypatch 将确保仅在夹具处于活动状态时应用更改。

【讨论】:

  • 谢谢!现在它起作用了!我最近才开始使用pytest和mock,所以你真的帮了我很多!
猜你喜欢
  • 1970-01-01
  • 2018-12-21
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 2018-01-21
相关资源
最近更新 更多