如何检查单元测试中的日志消息和调用的方法?

0 投票
1 回答
624 浏览
提问于 2025-04-16 21:30

我正在使用Django 1.3,想要检查我的日志系统的输出和交互次数。我用的是Django-Sentry来记录日志,但看起来它的工作方式和普通的Python日志记录器差不多。

我使用python-mockito来进行模拟,如果可以的话,我想检查不同方法被调用的次数以及它们返回的消息。

我想实现一个检查,效果类似于:

from foo import views
logger = mock()
views.logger = logger
do_method()
verify(logger).error(any, any)
do_method()
verifyZeroInteractions(logger)

能够检查参数也是很不错的。

models.py

from django.db import models
import logging
from sentry.client.handlers import SentryHandler

logger = logging.getLogger(__name__)

try:
    is_logging_setup = True
except NameError:
    is_logging_setup = True
    logger.setLevel(settings.LOGGING_LEVEL)
    logger.addHandler(SentryHandler())

class Foo(models.Model):
    def bar(self):
        logger.warning("Rawr", 'extra': { 'data': 'foo' })

tests.py

class TestModelFoo(TestCase):
    def setUp(self):
        self.foo = Foo()

    def test_getting_logged(self):
        self.foo.bar()
        # Check the log output.

有没有什么建议可以让我捕捉到输出呢?

1 个回答

0

这里有一些代码,使用的是标准的 mock Python 库,能够实现你想要的功能。

    with mock.patch('infra.manifest.fake_put') as fake_patch:
        infra.manifest.copy_files(root, files, folder, True)

    args, kwargs = fake_patch.call_args

    self.assertEqual((u'/etc/a.tmp', u'/tmp/a.tmp'), args)
    self.assertEqual({'use_sudo': True}, kwargs)

你需要关注的是 mock.patch 这个方法。我觉得还有其他框架可以让你指定一个 passthrough 关键字,这样就可以调用原来的方法。而这个方法会把被替换的方法变成一个模拟调用,不会调用原来的方法。

撰写回答