2015-03-19 7 views
23

Sto cercando di capire la differenza tra questi due approcci di derisione di un metodo. Qualcuno potrebbe aiutarmi a distinguerli? Per questo esempio, io utilizzare la libreria passlibQual è la differenza tra mock.patch.object (... e mock.patch (

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) 

risposta

38

È già scoperto la differenza;.. mock.patch() prende una stringa che verrà risolto in un oggetto quando si applica la patch, mock.patch.object() prende un riferimento diretto

Ciò significa che mock.patch() non richiede e di importare l'oggetto prima delle patch, mentre lo mock.patch.object() richiede l'importazione prima delle patch.

Quest'ultimo è quindi più facile da usare se si dispone già di un riferimento all'oggetto.

+1

Grazie per la risposta, Martijn, e per averlo chiarito. – Dowwie