Monkeypatching: вызов оригинального смоделированного метода после изменения некоторых его аргументов - PullRequest
1 голос
/ 29 мая 2019

Мы хотим протестировать функцию, которая читает некоторый файл данных (data_file.dat), расположенный в данных пакета. Упрощенная версия этой функции выглядит так:

import pkg_resources


def get_data_file_content():
    data_file_path = pkg_resources.resource_filename("mymodule", "data/data_file.dat")
    with open(data_file_path, 'r') as f:
        return f.read()

Наш проект имеет следующую структуру:

myproject
├───mymodule
│   ├───data
│   │   └───data_file.dat
│   ├───data_provider.py
│   └───__main__.py
├───tests
│   ├───data
│   │   └───data_file.dat
│   └───test_data_provider.py
└───setup.py

Мы хотим использовать каталог данных пакета в тестовом пакете при каждом запуске теста.

Для этого мы хотим заглушить вызовы на pkg_resources и изменить первый аргумент. Нам удалось сделать это, используя следующее (test_data_provider.py):

from mymodule.data_provider import get_data_file_content


@pytest.fixture(autouse=True)
def mock_pkg_resources(monkeypatch):
    original_method = pkg_resources.resource_filename

    def resource_filename_stub(_, file_name):
        return original_method("tests", file_name)

    monkeypatch.setattr(pkg_resources, "resource_filename", resource_filename_stub)


def test_get_data_file_content():
    data = get_data_file_content()
    assert data == "test data (the content does not matter)"

Есть ли лучший способ добиться этого, вместо создания псевдонима для метода-заглушки, или вообще есть другие рекомендации по замене данных пакета в тестах?

...