Патчинг обезьян с помощью 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()) похоже, работает, но возвращенные значения не используются заранее (или исправление не происходит).

0 ответов

Другие вопросы по тегам