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
的两个实例,即使使用相同的参数创建,也不相等。
您在代码中创建了两个实例: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
),但不是大多数 类.
有帮助吗?
我在一个名为 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
的两个实例,即使使用相同的参数创建,也不相等。
您在代码中创建了两个实例: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
),但不是大多数 类.
有帮助吗?