如何检查单元测试中的日志消息和调用的方法?
我正在使用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
关键字,这样就可以调用原来的方法。而这个方法会把被替换的方法变成一个模拟调用,不会调用原来的方法。