我正在尝试测试我的方法login_imap((,但得到了AssertionError:未引发错误。Python 3.9我做错了什么?
def login_imap(self, connection, user, password):
try:
if not connection.login(user, password):
raise imaplib.IMAP4.error("Login failed!")
except imaplib.IMAP4.error as error:
print("Login failed!")
return connection
测试功能:
def test_afunction_throws_exception(self):
user = '***'
password = '***'
server = '***'
connection = imaplib.IMAP4_SSL(server)
with self.assertRaises(imaplib.IMAP4.error) as e:
MailMessage.login_imap(self, connection, user, password)
您使用try...except
来处理login_imap
函数中引发的异常。而且,您没有在except
块内再次引发异常。因此,在测试用例中,没有出现异常。这就是self.assertRaises()
失败的原因。
正如assertRaises医生所说:
测试在使用任何位置或关键字参数调用callable时是否引发异常,这些参数也传递给
assertRaises()
。如果引发异常,测试通过;如果引发另一个异常,测试为错误;如果未引发异常,则测试失败。
如果删除try...except
,测试用例就会通过。此外,您可以创建一个模拟连接,而不是真实连接。
例如
main_message.py
:
import imaplib
def login_imap(self, connection, user, password):
# try:
if not connection.login(user, password):
raise imaplib.IMAP4.error("Login failed!")
# except imaplib.IMAP4.error as error:
# print("Login failed!")
return connection
test_mail_message.py
:
from unittest import TestCase
import unittest
from unittest.mock import Mock
import imaplib
from mail_message import login_imap
class TestMailMessage(TestCase):
def test_login_imap_throws_exception(self):
user = '***'
password = '***'
connection = Mock()
connection.login.return_value = False
with self.assertRaises(imaplib.IMAP4.error) as e:
login_imap(self, connection, user, password)
if __name__ == '__main__':
unittest.main()
测试结果:
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
Name Stmts Miss Cover Missing
-------------------------------------------------------------------------------
src/stackoverflow/70070717/mail_message.py 5 1 80% 10
src/stackoverflow/70070717/test_mail_message.py 15 0 100%
-------------------------------------------------------------------------------
TOTAL