我在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'
))
答案 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中遇到了这个问题。以下是解决方案。
django.middleware.transaction.TransactionMiddleware已被弃用。如果你的settings.py文件中没有这个,你不应该收到错误。
无意中,我发现如果您在中间件列表中留下了django.middleware.transaction.TransactionMiddleware,那么包括ATOMIC_REQUESTS:True会解决错误。
E.g。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'sqlite3-db',
'ATOMIC_REQUESTS': True
}
}