Благодаря объяснению Криса Ханта я нашел альтернативное решение. Это действительно изменяет код приложения, а не тестовый код, но если это приемлемо (что, вероятно, должно быть в наши дни, так как наличие тестируемого кода является высоким приоритетом), это действительно простое решение:
Невозможно смоделировать year_in_range
, поскольку ссылка на исходную функцию сохраняется до того, как будет выполнено смоделирование. Поэтому «оберните» функцию, которую вы хотите смоделировать, другой функцией и передайте оболочку. Обертывание может быть сделано аккуратно и аккуратно, используя лямбда-функции:
def year_in_range(year):
return datetime.now().year <= year <= datetime.now().year + 10
class StudentsResource(Resource):
args = {
'graduation_year': fields.Int(required=True, validate=lambda y: year_in_range(y)),
}
...
Теперь, когда я высмеиваю year_in_range
, как указано в вопросе, это будет работать. Причина в том, что теперь ссылка сохраняется в лямбда-функции, а не в исходную year_in_range
(к которой не будет доступа, пока не будет запущена лямбда-функция, что будет во время теста).