web-dev-qa-db-fra.com

Quelle est la différence entre mock.patch.object (... et mock.patch (

J'essaie de comprendre la différence entre ces deux approches de se moquer d'une méthode. Quelqu'un pourrait-il aider à les distinguer? Pour cet exemple, j'utilise la bibliothèque 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)
45
Dowwie

Vous avez déjà découvert la différence; mock.patch() prend une chaîne qui sera résolue en un objet lors de l'application du patch, mock.patch.object() prend une référence directe.

Cela signifie que mock.patch() ne nécessite pas que vous importiez l'objet avant d'appliquer les correctifs, tandis que mock.patch.object() requiert que vous importiez avant d'appliquer les correctifs.

Ce dernier est alors plus facile à utiliser si vous disposez déjà d'une référence à l'objet.

78
Martijn Pieters