在测试期间可以查看(外部)数据库吗?

时间:2016-09-12 13:50:42

标签: django

我正在尝试写一个测试 -

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)

更新 我忘记了交易,因此看起来在测试期间无法查看数据库。我是对的吗?

2 个答案:

答案 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数据库上运行测试。