Подтвердить что ты не робот

В чем разница между mock.patch.object(... и mock.patch(

Я пытаюсь понять разницу между этими двумя подходами насмешивания метода. Может кто-то, пожалуйста, поможет их отличить? В этом примере я использую библиотеку passlib.

from passlib.context import CryptContext
from unittest import mock

with mock.patch.object(CryptContext, 'verify', return_value=True) as foo1:
    mycc = CryptContext(schemes='bcrypt_sha256')
    mypass = mycc.encrypt('test')
    assert mycc.verify('tesssst', mypass)

with mock.patch('passlib.context.CryptContext.verify', return_value=True) as foo2:
    mycc = CryptContext(schemes='bcrypt_sha256')
    mypass = mycc.encrypt('test')
    assert mycc.verify('tesssst', mypass)
4b9b3361

Ответ 1

Вы уже обнаружили разницу; mock.patch() принимает строку, которая будет разрешена для объекта при применении патча, mock.patch.object() принимает прямую ссылку.

Это означает, что mock.patch() не требует, чтобы вы импортировали объект перед исправлением, а mock.patch.object() требует, чтобы вы импортировали до исправления.

Последний легче использовать, если у вас уже есть ссылка на объект.