web-dev-qa-db-ja.com

mock.patch.object(...とmock.patch(

メソッドをモックするこれら2つのアプローチの違いを理解しようとしています。誰かがそれらを区別するのを手伝ってもらえますか?この例では、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

あなたはすでに違いを発見しました。 mock.patch()は、オブジェクトに解決される文字列を受け取りますパッチを適用するときmock.patch.object()は直接参照を受け取ります。

つまり、mock.patch()ではパッチを適用する前にオブジェクトをインポートする必要はなく、mock.patch.object()ではパッチを適用する前にインポートする必要があります。

オブジェクトへの参照が既にある場合、後者の方が使いやすくなります。

78
Martijn Pieters