【发布时间】: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