【问题标题】:Assertion Error when logging.exception(error)logging.exception(error) 时的断言错误
【发布时间】:2022-01-25 12:29:36
【问题描述】:

我在一个名为 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'))]

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

【问题讨论】:

    标签: python unit-testing python-unittest


    【解决方案1】:

    问题在于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),但不适用于大多数类。

    有帮助吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 2018-05-19
      • 2014-09-27
      • 2014-03-26
      • 1970-01-01
      相关资源
      最近更新 更多