gpt4 book ai didi

python - 如何模拟异步代码调用的函数?

转载 作者:行者123 更新时间:2023-12-05 06:07:34 26 4
gpt4 key购买 nike

这个测试有效。

def test_mock_ingest():
with mock.patch('app.ingest.ingest') as mock_ingest:
app.ingest.ingest('test-data', {'test-key': 'test-value'})
assert mock_ingest.call_count == 1

此测试失败,因为 mock_ingest.call_count = 0

def test_mock_ingest():
with mock.patch('app.ingest.ingest') as mock_ingest:
call_function_that_runs_async_code()
assert mock_ingest.call_count == 1

call_function_that_runs_async_code 调用 app.ingest.ingest 函数。

我知道,因为我可以看到测试数据已被提取。

但是由于某些原因,mock_ingest.call_count 仍然是 0。

我认为这与运行 app.ingest.ingest 的代码是异步的这一事实有关。

编辑:

我正在使用 python 3.8。

我也试过没有成功:

```python
def test_mock_ingest():
with mock.patch('app.ingest.ingest', new_callable=mock.AsyncMock) as mock_ingest:
call_function_that_runs_async_code()
assert mock_ingest.call_count == 1

最佳答案

毕竟,该解决方案与异步代码无关。

call_function_that_runs_async_code 没有调用 app.ingest.ingest

它在 ingest 导入之后调用 ingest,如下所示:from app.ingest import ingest

该导入是正确的,但由于模拟的命名空间问题,在应用程序代码和测试代码中以不同方式导入函数不起作用。

直到你在导入函数的地方修补函数,而不是在定义函数的地方。 https://docs.python.org/3/library/unittest.mock.html#where-to-patch

我的示例中正确的解决方案代码应如下所示:

def test_mock_ingest():
with mock.patch('async_codebase.ingest') as mock_ingest:
call_function_that_runs_async_code()
assert mock_ingest.call_count == 1

其中 async_codebase 包含导入:

from app.ingest import ingest

关于python - 如何模拟异步代码调用的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65398763/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com