如何检查日志消息和称为单元测试的方法?

时间:2011-07-14 07:44:36

标签: python unit-testing testing python-mock

我正在使用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 :(得分: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关键字,它也会调用原始方法,这个方法会将修补后的方法转换为模拟调用而不是调用原始方法。