1. ホーム
  2. python

[解決済み] mock.patch.object(...)とmock.patch(...)の違いは何ですか?

2023-05-23 09:02:04

質問

私はメソッドをモックするためのこれらの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)

どのように解決するのですか?

すでに違いを発見しているのですね。 mock.patch() はオブジェクトに解決される文字列を取ります。 パッチを適用する際に , mock.patch.object() は直接参照を取ります。

これはつまり mock.patch() はパッチを当てる前にオブジェクトをインポートする必要がないのに対して mock.patch.object() はパッチを当てる前にインポートする必要があります。

そして後者は、すでにオブジェクトへの参照を持っている場合に使いやすくなります。