要回答最初的问题“如何使用 pytest-mock 或 magicmock 模拟导入的对象”,您可以执行以下操作:
from unittest import mock # because unittest's mock works great with pytest
def test_some_func1():
with mock.patch('some_module1.db', mock.MagicMock(return_value=...)) as magicmock:
result = some_func1(...)
assert ... e.g. different fields of magicmock
assert expected == result
# or alternatively use annotations
@mock.patch('some_module2.db', mock.MagicMock(return_value=...))
def test_some_func2():
result = some_func2(...)
请注意,您没有修补数据库的实际来源 http://alexmarandon.com/articles/python_mock_gotchas/
对于您的其他用例
我想模拟数据库(使用 mongo 数据库),更具体地说是“db_conn”对象
您同样按照上面链接的提示进行操作:
mock.patch('some_module1.db_conn', mock.MagicMock(return_value=...))
鉴于此,您会在测试中注意到db
从 `db = db_conn.db_name2.db_collection2' 将创建另一个模拟对象。对该对象的调用也将被记录。通过这种方式,您还可以跟踪呼叫和值分配的历史记录。
此外,请参阅如何修补 mongodb 的示例。 https://stackoverflow.com/a/51994349/1256837
要测试 Flask 应用程序,请参阅烧瓶的文档 https://flask.palletsprojects.com/en/1.1.x/testing/. Also 这也是一个很好的解释,并且使用数据库连接 https://www.patricksoftwareblog.com/testing-a-flask-application-using-pytest/.
作为一般提示,就像 @MikeMajara 提到的那样 - 将代码更多地分成更小的函数,这些函数也易于测试。 TDD 的传统是:先编写测试,然后实现,然后重构(尤其是 DRY!)