此测试有效。
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
答案 0 :(得分:0)
毕竟解决方案与异步代码无关。
call_function_that_runs_async_code
没有调用 app.ingest.ingest
。
它在 ingest
像这样导入后调用 ingest
:from app.ingest import ingest
。
该导入是正确的,但由于模拟的命名空间问题,跨应用程序代码和测试代码以不同方式导入函数不起作用。
TIL 修补函数是在导入它们的地方,而不是在定义它们的地方。 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