mock.patch.object(...和mock.patch之间的区别是什么?

Dow*_*wie 48 python unit-testing mocking

我试图理解这两种模拟方法的方法之间的区别.有人可以帮助区分它们吗?对于此示例,我使用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)
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 83

你已经发现了差异; mock.patch()采用一个字符串,在应用补丁时将解析为一个对象,mock.patch.object()直接引用.

这意味着mock.patch()不需要在修补之前导入对象,同时mock.patch.object()需要在修补之前导入.

如果您已经有对象的引用,那么后者更容易使用.

  • @mblakesley:您不能直接模拟任何“datetime.datetime”方法。不使用“mock.patch()”,也不使用“mock.patch.object()”。您只能完整地模拟“datetime.datetime”。 (2认同)