我正在尝试将Django项目从1.8版带到1.11版。除了单元测试之外,几乎所有东西看起来都很好。我们有一个基础测试类继承自Django TestCase和Tastypie mixin。基类在setUp()中有一些代码,如下所示
class BaseApiTest(ResourceTestCaseMixin, django.test.TestCase):
def setUp(self):
super().setUp()
self.username = "secret_user"
self.password = "sekret"
self.email = "secret@mail.com"
self.first_name = "FirstName"
self.last_name = "LastName"
self.user = User.objects.create_superuser(
self.username,
self.username,
self.password
)
应用程序特定的测试将继承基本测试并执行类似
的操作class TheAPITest(BaseApiTest):
def setUp(self):
super().setUp()
# more setup goes here
所以,在Django 1.8.x下,这很好用。但是在1.11.x下,所有这些都给我User.objects.create_superuser() line
上的错误。
django.db.utils.InterfaceError: connection already closed
我一直在阅读发行说明,但是在1.8和1.11之间发生了太多的事情。我缺少一些简单的东西吗?
答案 0 :(得分:3)
拥有错误跟踪可能很有用。 但是在代码中,我看到了这个错误:
self.user = User.objects.create_superuser(
self.username,
self.username, **this should be self.email**
self.password
)
答案 1 :(得分:2)
我已经发现了我的单元测试覆盖率的多个问题,但为了回答我发布的问题,两个单独的问题导致了我所描述的错误。
Django 1.11对其模型实例创建更严格,我们有一些未更新到新模型结构的遗留测试代码。例如,如果您使用默认的User模型,则可以在Django 1.8中执行
from django.contrib.auth.models import User
User.objects.create(username="something", password="something", something="something")
但在Django 1.11中,它会引发异常"TypeError: 'something' is an invalid keyword argument for this function"
。
第二个问题是Django TestCase将测试用例包装在两个独立的原子块中。这有助于将类级别设置与实例级别设置分开,但它也引入了一个微妙的问题。如果测试因数据库错误而崩溃,您永远不会看到错误,因为它发生在测试级别的原子级而不是类级别的原子级。测试级别原子失败,数据库连接被删除。之后,每次测试都会失败并出现我所看到的确切django.db.utils.InterfaceError: connection already closed
错误。从TestCase切换到TransactionTestCase导致许多这些问题直接暴露在测试输出中。