logging.exception(错误)时的断言错误

Assertion Error when logging.exception(error)

我在一个名为 mymodule.py

的脚本中有这个功能
import logging

def foo():
    try:
        raise ConnectionError('My Connection Error')
    except ConnectionError as ce:
        logging.exception(ce)

我有一个名为 test_mymodule.py:

的测试
import unittest
import unittest.mock as um
import mymodule

class TestLoggingException(unittest.TestCase):

    @um.patch('mymodule.logging')
    def test_connection_error_correctly_logged_without_raising(self, mock_logging):
        mymodule.foo()

        mock_logging.assert_has_calls(
            [um.call(ConnectionError('My Connection Error'))]
        )

然而,当运行 test_mymodule.py时,出现下面的断言错误。

AssertionError: Calls not found.
Expected: [call(ConnectionError('My Connection Error'))]
Actual: [call(ConnectionError('My Connection Error'))]

为什么它认为它们不同,我该如何解决这个问题?

问题是 ConnectionError 的两个实例,即使使用相同的参数创建,也不相等。

您在代码中创建了两个实例:fooum.call()
但是,这两个实例不相同,因此不相等。你可以简单地说明这一点:

>>> ConnectionError("test") == ConnectionError("test")
False

一种解决方案是检查对模型进行了哪些调用。这些调用通过名为 mockup_calls.
的变量公开 像这样

class TestLoggingException(unittest.TestCase):

    @um.patch('mymodule.logging')
    def test_connection_error_correctly_logged_without_raising(self, mock_logging):
        mymodule.foo()

        print("Calls are: ", mock_logging.mock_calls)

        # Check that logging was called with logging.exception(ConnectionError("My Connection Error"))
        calls = mock_logging.mock_calls
        assert(len(calls) == 1)
        # Unpack call
        function_called, args, kwargs = calls[0]
        assert(function_called == "exception")
        connection_error = args[0]

        assert(isinstance(connection_error, ConnectionError))
        assert(connection_error.args[0] == "My Connection Error")  # This will depend on how ConnectionError is defined
        

这个例子的棘手之处在于它可以处理计算结果相等的类型,即使它们不相同,比如 str"hi" == "hi" 将产生 True),但不是大多数 类.

有帮助吗?