【发布时间】:2021-08-17 17:23:37
【问题描述】:
我有一个基类,我在其中连接到 mongodb 集合并从 hdfs 文件中读取日期值,然后删除与从此 hdfs 文件中读取的值相比更旧的值。我在单元测试方面遇到了一些问题,所以:
在子类中,我有以下内容:
def remove_old_sources(self):
input_date = self.get_date_from_input()
mongo_collection = self.connect_to_collection(db, collection)
deleted_files_count = self.delete_stale_documents(mongo_collection, input_date)
上面调用的所有函数都来自基类。我的问题是如何通过以下方式模拟它们:
带有datetime 对象的input_date 和带有Collection 的mongo_collection 来自mongomock,例如:
mocked_collection = mongomock.MongoClient().db.collection
mocked_collection.insert_many([
{'_id': '1', 'time': datetime(2010, 10, 10, 10, 10, 10)},
{'_id': '2', 'time': datetime(2015, 10, 10, 10, 10, 10)},
{'_id': '3', 'time': datetime(2020, 10, 10, 10, 10, 10)},
{'_id': '4', 'time': datetime(2030, 10, 10, 10, 10, 10)},
{'_id': '5', 'time': datetime(2040, 10, 10, 10, 10, 10)},
])
如果我理解正确的话,这个mongomock 在内存中创建了一个本地 mongodb。
我试过了:
@mock.patch("path_to_base_class.get_date_from_input")
@mock.patch("path_to_base_class.connect_to_collection")
def test_remove_old_docs(connect_mock, date_mock)
然后初始化子类并运行remove_old_sources 但模拟对象是MagicMock 这样的对象,我不确定如何用上面提到的内容覆盖它们。还尝试使用上下文管理器with mock.patch(BaseClass, "function_name", mocked_stuff),然后初始化Child 类,但它不能像这样工作。
非常感谢您对此的任何帮助!
【问题讨论】:
标签: python unit-testing testing mocking