Mad*_*bat 15 python django django-unittest tastypie python-unittest
我试图将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
)
Run Code Online (Sandbox Code Playgroud)
应用程序特定的测试将继承基本测试并执行类似的操作
class TheAPITest(BaseApiTest):
def setUp(self):
super().setUp()
# more setup goes here
Run Code Online (Sandbox Code Playgroud)
所以,在Django 1.8.x下,这很好用.但是在1.11.x下,所有这些都给我一个错误User.objects.create_superuser() line
.
django.db.utils.InterfaceError: connection already closed
我一直在阅读发行说明,但是在1.8和1.11之间发生了太多的事情.我缺少一些简单的东西吗?
我发现了单元测试覆盖率的多个问题,但是为了回答我发布的问题,两个单独的问题导致了我描述的错误。
Django 1.11 对其模型实例创建更加严格,我们有一些未更新为新模型结构的遗留测试代码。例如,如果您采用默认的 User 模型,则在 Django 1.8 中您可以这样做
from django.contrib.auth.models import User
User.objects.create(username="something", password="something", something="something")
Run Code Online (Sandbox Code Playgroud)
但是在 Django 1.11 中它会引发异常"TypeError: 'something' is an invalid keyword argument for this function"
。
第二个问题是 Django TestCase 将测试用例包装在两个单独的原子块中。这有助于将类级别设置与实例级别设置分开,但它也引入了一个微妙的问题。如果测试因数据库错误而崩溃,您永远不会看到错误,因为它发生在测试级别原子而不是类级别原子中。测试级别原子失败并且数据库连接被删除。在那之后,每个测试都会失败,并django.db.utils.InterfaceError: connection already closed
出现我看到的确切错误。从 TestCase 切换到 TransactionTestCase 导致许多这些问题直接在测试输出中暴露出来。
归档时间: |
|
查看次数: |
888 次 |
最近记录: |