python - 单元测试中的模拟日志处理程序

标签 python unit-testing

我有以下记录器设置:

logger = logging.getLogger(__name__)
logger.setLevel(logging.ERROR)
file_handler = logging.FileHandler('foo.log')
formatter = logging.Formatter('%(asctime)s: %(message)s')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)

在单元测试时如何阻止记录器实际将条目写入磁盘?我目前正在检查 logger.error 的调用方式如下:

@mock.patch('mymodule.logger')
def test_error_is_logged(self, mock_logger):
    mymodule.func() # this causes an error to be logged
    self.assertTrue(mock_logger.error.called)

上述测试工作正常,但是日志文件 foo.log 是在磁盘上创建的,我想避免这种情况。我想知道的是在模拟文件创建时是否调用了 logger.error 。

最佳答案

您的情况的问题是,在该行的那一刻已经创建了空文件“foo.log”

file_handler = logging.FileHandler('foo.log')

被执行。您可以通过添加delay参数来避免这种情况:

file_handler = logging.FileHandler('foo.log', delay=True)

这将延迟文件的创建,直到写入一些内容为止。

关于python - 单元测试中的模拟日志处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53007488/

相关文章:

python - 在 Python 中,如何在不将实例传递给它的情况下使用类方法?

java - 如何跳过测试代码或将oracle语法转换为h2

java - 为什么这个 Mockito.mock 对象被调用而不是被模拟?

python - 如何选择 numpy 数组中的行索引?

python - 从 python 在 shell 中启动外部 shell python 实例

python - .contents 和 .children 之间的区别

python - 单元测试 Tornado 应用程序: How to improve the display of error messages

python - factoryboy pytest session 管理

java - 在 Calendar.getInstance() 模拟中获取 NotAMockException

python - 支持二进制的 Tornado websockets