我正在尝试写一个测试 -
from django.test import TestCase
from django.test.client import Client
class MyTests(TestCase):
def _create_person_object(self):
person = Person(email='test@example.com', password='test')
person.save()
return
def _login():
self.client.post('/login/', {'email': 'test@example.com', 'password' : 'test'})
return
def setUp(self):
self.client = Client()
def test_login(self):
self._create_person_object()
self._login()
input('wait and enter')
# person = Person.object.get(email ='test@example.com')
# self.assertEqual(person.password, 'test') #
response = self.client.get('/denied_area/')
self.assertEqual(response.status_code, 200)
更新 我忘记了交易,因此看起来在测试期间无法查看数据库。我是对的吗?
答案 0 :(得分:1)
是的,项目会保存到数据库中(尽管它会在每次测试之前刷新数据库)。
您的错误正在发生,因为您正在保存纯文本密码,但Django的auth框架将始终针对哈希密码进行测试。您应始终通过create_user
经理方法创建用户,该方法负责为您散列密码:
def _create_person_object(self):
Person.objects.create_user('test', email='test@example.com', password='test')
(请注意,如果您实际上没有返回值,则不需要在每个函数末尾使用return语句。)
答案 1 :(得分:-2)
Django for tests正试图删除旧数据库并创建一个新数据库。
因此,当您运行测试时,它会尝试删除您在settings.py文件中设置的任何数据库,创建它,运行迁移,运行测试。
对于这种方法,我建议做这样的事情:
if any([arg in sys.argv for arg in ['jenkins', 'test']]):
DATABASES['default'] = {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(os.path.dirname(__file__), 'default.db'),
'TEST_NAME': os.path.join(os.path.dirname(__file__), 'default.db'),
}
REST_FRAMEWORK = {}
else:
DATABASES = {
'default': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': 'your_database_name',
'USER': 'database_user',
'PASSWORD': 'database_password',
'HOST': 'localhost', # or some other host
}
}
所以当你运行命令./manage.py test
时,它会自动在你的default.db数据库上运行测试。