Python测试login_imap方法报AssertionError: error not raised问题排查
问题根因
- 你自定义的
login_imap方法内部已经通过try-except捕获了全部imaplib.IMAP4.error类型的异常,异常不会流出方法作用域,测试函数中的assertRaises自然无法捕获到预期异常,因此抛出AssertionError: error not raised。 - 额外存在逻辑冗余问题:
imaplib的login方法登录失败时会直接抛出IMAP4.error异常,不会返回布尔值,你编写的if not connection.login(user, password)判断分支永远不会触发,手动抛异常的代码是无效的。
修复方案
方案一:保留业务侧异常捕获逻辑
如果你的业务要求登录失败只打印日志、不向外抛出异常,可新增标记位来标识登录结果,调整代码如下:
业务方法修改
def login_imap(self, connection, user, password): self.login_success = True try: connection.login(user, password) except imaplib.IMAP4.error as error: print("Login failed!") self.login_success = False return connection
测试方法修改
def test_afunction_login_failed(self): user = '***' password = '***' server = '***' connection = imaplib.IMAP4_SSL(server) mail_obj = MailMessage() mail_obj.login_imap(connection, user, password) # 校验标记位替代校验异常 self.assertFalse(mail_obj.login_success)
方案二:移除内部异常捕获逻辑
如果业务侧不需要处理登录异常,需要将异常抛出给上层调用方处理,直接删掉login_imap中的try-except包裹即可,原有测试代码无需修改:
def login_imap(self, connection, user, password): connection.login(user, password) return connection
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

