Патчинг обезьян с помощью pytest и mongodb
У меня следующая архитектура каталогов:
-api
--services, interfaces, controller
-tests
--test files, conftest
conftest выглядит так:
# create flask server
@pytest.yield_fixture
def app():
app = create_app(env="testing")
return app
@pytest.yield_fixture
def client(app):
return app.test_client()
# mock MongoDB database connection object using mongomock
@pytest.fixture(scope="function")
def mongo_db_connection_mock(monkeypatch):
db_conn = mongomock.MongoClient()
return db_conn
В своих тестах я пытаюсь исправить несколько функций:
@pytest.mark.parametrize(
"input, output, iteration",
[
([1, 2, 3], 4, 0),
([], None, 1)
],
)
def test_func(
mocker, mongo_db_connection_mock, input, output, conftest_pytest_fixture
):
path = services_relative_path + ".fetch_mongo_connection"
mocker.patch(path, return_value=mongo_db_connection_mock)
path = services_relative_path + ".read_from_mongo"
mocker.patch(path, return_value=conftest_pytest_fixture[iteration])
result = target_func(input)
assert result = output
Conftest_pytest_fixture - это прибор pytest, объявленный в conftest следующим образом:
def generate_emails():
emails = [faker.email() for item in range(2)]
return emails
Однако мои функции не исправляются. От пропатченных функций ничего не получаю. Каким должен быть правильный способ использования pytest с mongodb?
Единственная помощь, которую я получил до сих пор, заключается в следующем: использование поддельной mongoDB для тестирования pytest, где
monkeypatch.setattr()
используется, что тоже не сработало для меня:
def test_func(
mocker, mongo_db_connection_mock, input, output, conftest_pytest_fixture
):
def fake_mongo():
return mongo_db_connection_mock
def fake_fetch(mongo_client, db, collection, query):
return conftest_pytest_fixture[iteration]
path = services_relative_path + ".fetch_mongo_connection"
monkeypatch.setattr(path, fake_mongo)
path = services_relative_path + ".read_from_mongo"
monkeypatch.setattr(path, fake_fetch)
result = target_func(input)
assert result = output
В обоих случаях тест выполняется успешно, но исправленный метод ничего не возвращает. Во втором случае при
monkeypatch.setattr()
, сама функция (fetch_mongo_connection()
и
read_from_mongo()
) похоже, работает, но возвращенные значения не используются заранее (или исправление не происходит).