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

时间:2015-03-19 18:18:56

标签: 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)

1 个答案:

答案 0 :(得分:71)

你已经发现了差异; mock.patch()获取一个字符串,该字符串将在应用修补程序时解析为对象mock.patch.object()将直接引用。

这意味着mock.patch()并不要求您在修补之前导入对象,而mock.patch.object()确实需要您在修补前导入。

如果你已经有了对象的引用,那么后者就更容易使用了。