繁体   English   中英

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

[英]Assertion Error when logging.exception(error)

我在一个名为 mymodule.py 的脚本中有这个 function

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的两个实例,即使使用相同的 arguments 创建,也不相等。

您在代码中创建了两个实例:在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 ),但不是大多数类。

它有帮助吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM