web-dev-qa-db-ja.com

logging.getlogger()をパッチ/モックするにはどうすればよいですか

私がテストしたいこのコードがあります:

log = logging.getLogger(__name__)


class A(object):
    def __init__(self):
        log.debug('Init')

しかし、log.debugが「Init」で呼び出されたことをアサートする方法がわかりません

ロガーにパッチを当ててみましたが、検査したところ、getLoggerモックしか見つかりませんでした。

シンプルだと思いますが、理解できません。

助けてくれてありがとう!

27
Philip Ridout

正しいロガーも使用していることを確認できる代替ソリューション:

logger = logging.getLogger('path.to.module.under.test')
with mock.patch.object(logger, 'debug') as mock_debug:
    run_code_under_test()
    mock_debug.assert_called_once_with('Init')
37
hwjp

logがモジュールmymodのグローバル変数であるとすると、getLoggerが返した実際のインスタンスをモックしたいと思います。これがdebugを呼び出します。次に、log.debugが正しい引数で呼び出されました。

with mock.patch('mymod.log') as log_mock:
    # test code
    log_mock.debug.assert_called_with('Init')
31
chepner

私はこの質問に遅れていますが、それを達成する別の方法は次のとおりです。

@patch('package_name.module_name.log')
def test_log_in_A(self, mocked_log):

    a = A()
    mocked_log.debug.assert_called_once_with('Init')
1
emcas88