Как бы вы справились с этим?
Я бы реорганизовал код так, чтобы использование удваивающихся тестов (также называемое насмешкой) было бы вариантом.
В частности, я хотел бы создать такие швы, чтобы
- Код, который реализует ввод / вывод, слишком прост, чтобы его потерпеть неудачу
- Весь сложный код не заботится о том, как осуществляется ввод / вывод.
На языке, подобном Java, шов будет интерфейсом. Мой код ввода / вывода будет реализовывать интерфейс, но сам по себе не будет выполняться в тесте.
Вместо этого в тесте использовался бы подходящий двойной тест - то, что реализует тот же интерфейс, но фактически не выполняет запись на диск.
Примечание: может быть несколько разновидностей test double, если я хочу, чтобы тесты имитировали различные виды ошибок записи, чтобы гарантировать, что сложная логика правильно обрабатывает эти сбои.
Корень композиции для производственного кода, конечно, должен создать экземпляр «реальной» реализации для использования. Но корень композиции для теста может вместо этого выбрать двойной тест, или файловую систему в памяти, или что угодно, чтобы гарантировать, что результаты теста являются детерминированными (и, между прочим, не влияют на время жизни вашего SSD).
Эвристика для того, какой код живет за сценой, приходит к нам из Hoare
Один из способов [разработки дизайна программного обеспечения] состоит в том, чтобы сделать его настолько простым, чтобы, очевидно, не было недостатков