В чем разница между 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)
Ответы
Ответ 1
Вы уже обнаружили разницу; mock.patch()
принимает строку, которая будет разрешена для объекта при применении патча, mock.patch.object()
принимает прямую ссылку.
Это означает, что mock.patch()
не требует, чтобы вы импортировали объект перед исправлением, а mock.patch.object()
требует, чтобы вы импортировали до исправления.
Последний легче использовать, если у вас уже есть ссылка на объект.