如何将 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)