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



此测试有效。

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

CCD_ 2调用CCD_ 3函数。

我知道,因为我可以看到测试数据被摄入。

但由于某种原因,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

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

TIL,您可以在导入函数的地方修补函数,而不是在定义函数的地方。https://docs.python.org/3/library/unittest.mock.html#where-修补

在我的例子中,正确的解决方案代码应该是这样的:

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

相关内容

  • 没有找到相关文章

最新更新