Что выведет код Senior Тестирование и pytest обновлено

Mock без spec и опечатка в методе

Вопрос

Что выведет код? По строке на каждый print.

from unittest.mock import Mock, create_autospec

class Mailer:
    def send(self, to, text):
        pass

loose = Mock()
loose.sned('a@b.ru', 'hi')
print('loose ok')
strict = create_autospec(Mailer, instance=True)
try:
    strict.sned('a@b.ru', 'hi')
except AttributeError:
    print('strict caught typo')

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: loose ok, strict caught typo. Обычный Mock создаёт любой атрибут по первому обращению, поэтому опечатка sned молча проходит, и тест может зеленеть, проверяя не то. createautospec строит мок по настоящему классу: несуществующий метод даёт AttributeError, а неверное…

Что выведет

loose ok
strict caught typo

Разбор

Обычный Mock создаёт любой атрибут по первому обращению, поэтому опечатка sned молча проходит, и тест может зеленеть, проверяя не то. create_autospec строит мок по настоящему классу: несуществующий метод даёт AttributeError, а неверное число аргументов TypeError.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме