以下方法被称为测试的一部分(测试试图在数据库中查找外部api调用,如果找不到它,它将进行真正的API调用)
def _ask_transliterate(self, content):
found = APITransliteration.objects.filter(
source_text=content, from_lang=self.from_lang, to_lang=self.to_lang
)
if len(found) == 0:
my_json = self._ask_actual_api(content, TRANSLIT_PATH, self.translit_params())
my = APITransliteration(
source_text=content, response_json=my_json, from_lang=self.from_lang, to_lang=self.to_lang
)
my.save()
return my.response_json
return found.first().response_json
当我只调用从TestCase
继承的类时,它运行良好,我认为这是因为它在数据库中找不到值,因此遵循内部if
。如果我进行了全部测试,则django
由于连接断开而拒绝破坏测试数据库,并且
SELECT * FROM pg_stat_activity;
报告是与first()
调用相对应的查询。这是有道理的,因为两个测试使用相同的参数调用了该方法,因此可以找到第二次运行的值(这是最后执行的测试)。对我而言,没有太大意义的是为什么在成功完成完整的测试运行后,连接处于ClientRead
和Idle
中。
是我在这里做错什么吗?我该怎么称呼它,以免在django
不知道需要清理的地方留下空闲连接?在测试的情况下,更糟的是它有时似乎会被清除,因为有时它会拒绝删除,而有时会删除就可以了。
编辑:我发现我可以通过创建TestRunner
并在运行程序运行teardown_databases
方法之前手动关闭连接来确保清理连接:
class CleanupTestRunner(DiscoverRunner):
def teardown_databases(self, old_config, **kwargs):
connections["userdata"].close()
connection.close()
super(CleanupTestRunner, self).teardown_databases(old_config, **kwargs)
尽管我在主代码中是否做错了一些事情,但我仍然感到困惑,因为这有点像个hack。