Имитация подключения к базе данных ⇐ Python
-
Anonymous
Имитация подключения к базе данных
У меня есть соединитель базы данных, который имеет соединение в конструкторе. Когда я запускаю модульный тест локально, кажется, что все проходит, но на этапе сборки в конвейере он, похоже, терпит неудачу из-за покрытия, а также из-за отсутствия соединения. Есть ли способ имитировать соединение, не изменяя сам разъем? Я бы предпочел не вызывать соединение в каждой функции, определенной в классе, требующем соединения. Спасибо.
--database_connector.py-- @dataclass класс DatabaseConnector: движок_базы_данных: ул экземпляр: str = "прочитать" защита __post_init__(сам): self.database_engine = "".join(filter(str.isalnum, self.database_engine.lower())) self.instance = "".join(filter(str.isalnum, self.instance.lower())) self.connection = self.get_connection() def get_connection(self) -> Соединение: если os.getenv("TEST") не имеет значения None: возврат Нет кваргс = { «база данных»: хост, «хост»: хост, «пользователь»: пользователь, «пароль»: пароль, «порт»: порт } return pg8000.connect(**kwargs def get_data(self, query: str) -> list[tuple]: с self.connection.cursor() в качестве курсора: курсор.execute (запрос) данные = курсор.fetchall() возвращать данные --mock_db.py-- db_path = "connectors.database.database_connector.DatabaseConnector" класс TestDBConnector(unittest.TestCase): защита test_db_connector (сам): если os.getenv("TEST") не имеет значения None: query_result = [(0, "1')] запрос = "ВЫБРАТЬ 1;" макет_курсор = макет.MagicMock() макет_курсор.execute.return_value = результат_запроса макет_соединение = макет.MagicMock() макет_соединение.курсор.возвращаемое_значение = макет_курсор результат = DatabaseConnector(database_engine="redshift").get_data(query) self.assertEqual(1, len(результат))
У меня есть соединитель базы данных, который имеет соединение в конструкторе. Когда я запускаю модульный тест локально, кажется, что все проходит, но на этапе сборки в конвейере он, похоже, терпит неудачу из-за покрытия, а также из-за отсутствия соединения. Есть ли способ имитировать соединение, не изменяя сам разъем? Я бы предпочел не вызывать соединение в каждой функции, определенной в классе, требующем соединения. Спасибо.
--database_connector.py-- @dataclass класс DatabaseConnector: движок_базы_данных: ул экземпляр: str = "прочитать" защита __post_init__(сам): self.database_engine = "".join(filter(str.isalnum, self.database_engine.lower())) self.instance = "".join(filter(str.isalnum, self.instance.lower())) self.connection = self.get_connection() def get_connection(self) -> Соединение: если os.getenv("TEST") не имеет значения None: возврат Нет кваргс = { «база данных»: хост, «хост»: хост, «пользователь»: пользователь, «пароль»: пароль, «порт»: порт } return pg8000.connect(**kwargs def get_data(self, query: str) -> list[tuple]: с self.connection.cursor() в качестве курсора: курсор.execute (запрос) данные = курсор.fetchall() возвращать данные --mock_db.py-- db_path = "connectors.database.database_connector.DatabaseConnector" класс TestDBConnector(unittest.TestCase): защита test_db_connector (сам): если os.getenv("TEST") не имеет значения None: query_result = [(0, "1')] запрос = "ВЫБРАТЬ 1;" макет_курсор = макет.MagicMock() макет_курсор.execute.return_value = результат_запроса макет_соединение = макет.MagicMock() макет_соединение.курсор.возвращаемое_значение = макет_курсор результат = DatabaseConnector(database_engine="redshift").get_data(query) self.assertEqual(1, len(результат))