После
from os import listdir имя listdir привязано в модуле product. Последующая подмена os.listdir эту привязку не меняет, поэтому код продолжает вызывать product.listdir.mock.patch работает как временное присваивание: заменяет имя по указанному пути, а после блока with возвращает исходное значение.Практическое правило: подменяйте имя там, где его ищет тестируемый код. Здесь нужен
mock.patch("product.listdir"). Он изменит поведение только product.py, не затрагивая другие модули. В статье Why your mock doesn’t work механизм разобран на двух способах импорта и схемах связей между именами.
