Python издеваясь удалить

Я практикую TDD, но я не использовал насмешки раньше.

Предположим, я хочу создать функцию, которая должна создать папку, но только если эта папка еще не существует. В рамках моего цикла TDD я сначала хочу создать тест, чтобы увидеть, что моя функция не будет удалять уже существующую папку.

В качестве моей функции, вероятно, будет использоваться ОС.rm, я думаю, что я мог бы использовать насмешку, чтобы увидеть, является ли os.rm был вызван или нет. Но это не очень удовлетворительно, так как есть много способов удаления папок. Что делать, если я изменю свою функцию позже, чтобы использовать shutil.rmtree? ОС.rm не был бы вызван, но, возможно, функция теперь неправильно удаляет папку.

Можно ли использовать насмешку таким образом, который нечувствителен к методу? (не создавая файлы на моей машине и не видя, удалены они или нет — то, что я делал до сих пор)

2 ответа

  1. Я могу думать о 2 вариантах:

    1. Вы обертываете удаление в функцию, например delete_folder; в тестах вы издеваетесь над функцией и проверяете, вызвана ли она.
    2. Pyfakefs используется для макетирования всей файловой системы. Я еще не использовал его, но он кажется очень мощным.
  2. Проблема «мокизма» заключается в том, что тесты привязывают ваш код к определенной реализации. После того, как вы решили протестировать вызов определенной функции, вы должны вызвать (или не вызывать, как в вашем примере) эту функцию в рабочем коде.

    Как вы уже заметили, существует множество способов удаления каталога (даже при запуске rm -rfкак внешнего процесса).

    Я думаю, что способ, которым вы это уже делаете, является лучшим — вы проверяете фактический побочный эффект, который вас интересует, независимо от того, как он был создан.
    Если вас интересует производительность, вы можете попробовать сделать этот тест необязательным и запускать его реже, чем остальной набор тестов.