Мы хотим протестировать функцию, которая читает некоторый файл данных (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)"
Есть ли лучший способ добиться этого, вместо создания псевдонима для метода-заглушки, или вообще есть другие рекомендации по замене данных пакета в тестах?