[英]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 创建,也不相等。
您在代码中创建了两个实例:在foo
和um.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.