Django测试client.login():当自动提交关闭时,您的数据库后端行为不正常。在使用'原子'之前打开它

时间:2013-12-16 00:00:39

标签: django unit-testing client

我在Django 1.6上,使用内置客户端编写单元测试,尝试测试登录调用。下面的代码总结了它。这是针对SQLite3数据库运行的。当我运行它时,调用self.client.login()方法时出现以下错误:

TransactionManagementError: Your database backend doesn't behave properly when autocommit is off. Turn it on before using 'atomic'.

试图设置:

'OPTIONS': {
    'autocommit': True,
}

在我的settings.py文件的数据库部分,但是没有帮助并生成了不同的错误消息:

KeyError: 'ENGINE'

对此的任何帮助将不胜感激。我的代码如下:

def testShouldRedirectToDashboardAfterSuccessfulLogin(self):
    from django.contrib.auth.models import User
    u = User.objects.create_user(
        username="a@b.cz",
        password='aaaaa',
        email="a@b.cz"
    )

    self.assertTrue(self.client.login(
        username='a@b.cz',
        password='aaaaa'
    ))

2 个答案:

答案 0 :(得分:3)

我找到了解决方案。我需要在测试方法调用的开头添加它,从而将整个测试方法调用包装在其中以打开自动提交:

def testShouldRedirectToDashboardAfterSuccessfulLogin(self):
    from django.db import transaction
    transaction.set_autocommit(True)
    try:
        from django.contrib.auth.models import User
        u = User.objects.create_user(
            username="a@b.cz",
            password='aaaaa',
            email="a@b.cz"
        )

        self.assertTrue(self.client.login(
            username='a@b.cz',
            password='aaaaa'
        ))
    finally:
        u.delete()
        transaction.set_autocommit(False)

我希望这有助于某人。我仍然有点困惑,为什么我必须这样做,因为文档说在Django 1.6中,“Autocommit最初打开。如果你关闭它,你有责任恢复它。”如果您有任何有价值的信息要添加到此,请在下面发表评论。如果能够对此发表更多信息,我会确保对你的评论进行投票。

答案 1 :(得分:1)

我使用Django 1.6在sqlite3 db中遇到了这个问题。以下是解决方案。

  1. django.middleware.transaction.TransactionMiddleware已被弃用。如果你的settings.py文件中没有这个,你不应该收到错误。

  2. 无意中,我发现如果您在中间件列表中留下了django.middleware.transaction.TransactionMiddleware,那么包括ATOMIC_REQUESTS:True会解决错误。

  3. E.g。

    DATABASES = {
      'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'sqlite3-db',
        'ATOMIC_REQUESTS': True
      }
    }