如何将 MongoMock 与 Pymongo-Flask 集成
How to integrate MongoMock with Pymongo-Flask
我想使用 mongomock 作为后端为我们的 mongo 代码编写一些单元测试。但是,Flask-PyMongo 在 Collection class 之上添加了一个方便的 class (find_one_or_404
),这意味着我无法直接进行 MongoMock 替换。任何将此函数猴子修补到集合 class 上的尝试似乎都不起作用(我认为它与被覆盖的 __getattr__
有关 - 每次我尝试时我都会得到 TypeError: 'Collection' object is not callable
db.collection_name.find_one_or_404({})
)。除了不使用这个功能,我还有什么选择?
在没有更好的想法的情况下,答案是“一路嘲笑”
@pytest.fixture
def mock_thing_collection(mocker):
mock_data = Mock()
mock_db = Mock()
mock_db.things = mock_data
mock = mocker.patch("app.mongo")
mock.db = mock_db
return mock_data
然后,在测试中
def test_things(mocker, client, mock_thing_collection):
return_items = ["a", "b", "c"]
find_mock = mocker.patch.object(mock_thing_collection, 'find', return_value=return_items)
我想使用 mongomock 作为后端为我们的 mongo 代码编写一些单元测试。但是,Flask-PyMongo 在 Collection class 之上添加了一个方便的 class (find_one_or_404
),这意味着我无法直接进行 MongoMock 替换。任何将此函数猴子修补到集合 class 上的尝试似乎都不起作用(我认为它与被覆盖的 __getattr__
有关 - 每次我尝试时我都会得到 TypeError: 'Collection' object is not callable
db.collection_name.find_one_or_404({})
)。除了不使用这个功能,我还有什么选择?
在没有更好的想法的情况下,答案是“一路嘲笑”
@pytest.fixture
def mock_thing_collection(mocker):
mock_data = Mock()
mock_db = Mock()
mock_db.things = mock_data
mock = mocker.patch("app.mongo")
mock.db = mock_db
return mock_data
然后,在测试中
def test_things(mocker, client, mock_thing_collection):
return_items = ["a", "b", "c"]
find_mock = mocker.patch.object(mock_thing_collection, 'find', return_value=return_items)