测试Django生成CSV方法后,后续单元测试报MySQLdb.OperationalError(2006)
问题
我正在对一个生成HttpResponse并导出CSV文件的方法进行单元测试,代码如下:
def _generate_csv(self): filename = self._get_filename('csv') # Create the HttpResponse object with the appropriate CSV header. response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename=%s' % filename writer = csv.DictWriter(response, csv_header_list, delimiter=";") writer.writeheader() for obj in object_list: writer.writerow(csv_dict) response.close() return response
运行单元测试时,该测试之前的所有用例均通过,但之后的所有测试都抛出错误:
MySQLdb.OperationalError: (2006, '')
请问为何测试此方法会导致其他测试失败?
分析与解决
问题根源在于你手动调用了response.close()。
- 在Django测试环境中,
HttpResponse的底层资源和数据库连接池存在隐性关联,尤其是当测试用例采用事务复用或共享连接的模式时。主动关闭响应对象会提前释放后续测试依赖的数据库连接资源,导致后续测试无法正常建立数据库连接,触发MySQL的2006错误(该错误代表连接已断开)。 - Django框架会自动管理
HttpResponse的生命周期,无需开发者手动调用close()方法。你这行代码破坏了测试环境中连接资源的复用机制,引发连锁问题。
解决方式:删除代码中的response.close()语句,让Django自行处理响应的资源释放逻辑即可恢复正常测试流程。
内容的提问来源于stack exchange,提问作者Ron
相关产品推荐
相关产品推荐

