使用 pytest 模拟在构造函数中定义的记录器

时间:2021-02-25 10:02:47

标签: python-3.x logging constructor mocking pytest

我定义了这个类:

class User():

    def __init__(self):
        self.logger = Logger('user.log')

    def get_data(self):
        _data = {
            'username': 'abc'
        }
        _payload = json.dumps(_data)
        self.logger.info("Loaded payload")
        return _payload

为 get_data() 编写的测试用例:

@mock.patch('mymodule.file_user.Logger')
def test_get_data(self,mock_logger):
    assert User().get_data() == "'username': 'abc'"
    mock_logger.info.assert_called_once_with(
        'Loaded payload')

此处的模拟失败给出了断言错误“预期的‘信息’被调用一次。调用了 0 次。”

1 个答案:

答案 0 :(得分:0)

Logger 是一个类,self.logger.info() 是一个实例方法。因此,您需要通过 mock_logger 获取 .return_value 的实例。

例如

logger.py

class Logger():
    def __init__(self, filepath) -> None:
        pass

    def info(message):
        print(message)

user.py

import json
from logger import Logger


class User():

    def __init__(self):
        self.logger = Logger('user.log')

    def get_data(self):
        _data = {
            'username': 'abc'
        }
        _payload = json.dumps(_data)
        self.logger.info("Loaded payload")
        return _payload

test_user.py

import unittest
from unittest import mock
from user import User


class TestUesr(unittest.TestCase):
    @mock.patch('user.Logger')
    def test_get_data(self, mock_logger):
        mock_logger_instance = mock_logger.return_value
        user = User()
        actual = user.get_data()
        self.assertEqual(actual, '{"username": "abc"}')
        mock_logger_instance.info.assert_called_once_with('Loaded payload')


if __name__ == '__main__':
    unittest.main()

单元测试结果:

 ⚡  coverage run /Users/dulin/workspace/github.com/mrdulin/python-codelab/src/stackoverflow/66366372/test_user.py && coverage report -m --include='./src/**'
.
----------------------------------------------------------------------
Ran 1 test in 0.002s

OK
Name                                      Stmts   Miss  Cover   Missing
-----------------------------------------------------------------------
src/stackoverflow/66366372/logger.py          5      2    60%   3, 6
src/stackoverflow/66366372/test_user.py      13      0   100%
src/stackoverflow/66366372/user.py           10      0   100%
-----------------------------------------------------------------------
TOTAL                                        28      2    93%
相关问题