#python #pytest #python-unittest #python-unittest.mock
#python #pytest #python-unittest #python-unittest.mock
Вопрос:
У меня есть задача написать тест для следующей функции:
def merge_files(cwd: Path, source: str, target: str):
"""[Merges the content of two files of the same data type]
Parameters
----------
cwd : Path
[Path of the the current work directory]
source : str
[File used to merge with target, lives in app subfolder]
target : str
[File used to merge with source]
"""
with open(os.path.join(cwd, "app", target), "a") as requirements_tool:
with open(os.path.join(cwd, source), "r") as requirements_user:
requirements_tool.write(requirements_user.read())
Моя проблема в том, что я понятия не имею, как написать для нее тест. Я новичок в тестировании и подумал, что для тестов я ничего не буду читать из файловой системы, а скорее буду имитировать ожидаемый результат файла. Я мог бы это сделать, но поскольку у меня нет возвращаемого значения, я также не могу проверить это.
Кто-нибудь знает, как реализовать тест для таких функций?
Редактировать: файлы будут requirements.txt
и requirements-dev.txt
Комментарии:
1. создайте 2 входных файла и 1 ожидаемый выходной файл. Сравните ожидаемый выходной файл с фактическим выходным файлом.
2. Вы могли бы использовать реальные файлы A, B и C, где C — это предопределенное слияние A и B. Затем запустите функцию для объединения A и B и посмотрите, получите ли вы то же содержимое, что и C. В конце теста удалите ваш временный выходной файл.
3. @drum: Можете ли вы показать мне, как это сделать? Должен ли я использовать для этого реальные файлы или использовать mocks?
4. Я не вижу проблем с чтением реальных файлов. Тестовый скрипт сам по себе является файлом, поэтому нет причин не сохранять объединяемые файлы и ожидаемый результат по ходу теста.
Ответ №1:
Вы можете создать временный каталог с помощью tempfile.TemporaryDirectory
. Затем вы можете создать все содержимое, необходимое для выполнения теста внутри этого каталога, а затем вызвать вашу функцию слияния. Например:
from pathlib import Path
from tempfile import TemporaryDirectory
def test_merge_files():
with TemporaryDirectory() as td:
td = Path(td)
f_target = td / 'app' / 'target'
f_source = td / 'source'
example_content_target = 'foo'
example_content_source = 'bar'
f_target.parent.mkdir()
f_target.write_text(example_content_target)
f_source.write_text(example_content_source)
merge_files(td, source=f_source, target=f_target)
assert f_target.read_text() == f'{example_content_target}{example_content_source}')
Комментарии:
1. спасибо, действительно приятно! Я не знал о временных каталогах!