我在我的项目中使用Django Rest Framework。 我写了测试:
class PatientTests(APITestCase):
def test_create_patient(self):
url = reverse('patient-list')
data = {'firstname': 'ivan', 'lastname': 'ivanov'}
response = self.client.post(url, data)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(Patient.objects.count(), 1)
self.assertEqual(Patient.objects.get().firstname, 'ivan')
def test_get_patient(self):
url = reverse('patient-detail', args=[1])
response = self.client.get(url)
self.assertEqual(response.data, {'firstname': 'ivan'})
models.py
class Patient(models.Model):
firstname = models.TextField()
lastname = models.TextField()
secondname = models.TextField()
class Meta:
db_table = "patient"
managed = False
def __str__(self):
return ' '.join([
self.firstname,
self.lastname,
])
当我运行测试时,我收到错误:“django.db.utils.ProgrammingError:关系”patient“不存在”。据我所知,如果未在测试数据库中创建表,则会发生此错误。我必须做什么?感谢
答案 0 :(得分:1)
首先从项目中删除所有.pyc文件。然后逐个运行以下命令。
$ django-admin.py migrate auth
$ django-admin.py migrate contentypes
$ django-admin.py migrate sites
$ django-admin.py migrate YOUR_USER_APP
$ django-admin.py migrate
如果这不起作用,请逐个使用所有应用的makemigrations,如下所示:
$ python manage.py makemigrations
$ python manage.py migrate --fake
并确保删除所有扩展名为.pyc的文件。
要实现此功能,请从代码中删除'managed = False'。该错误是因为您的数据库中没有名为“patient”的表。
答案 1 :(得分:0)
为测试创建模型(我使用的常见模式)是在测试执行之前将它们标记为托管。为此,您可以创建custom test runner并覆盖setup_test_environment
:
class CustomRunner(DiscoverRunner):
def setup_test_environment(self, *args, **kwargs):
from django.db.models.loading import get_models
self.unmanaged_models = [
m for m in get_models() if not m._meta.managed
]
for m in self.unmanaged_models:
m._meta.managed = True
然后测试设置将specify作为字符串的测试运行器的模块路径:
TEST_RUNNER = module.path.to.CustomRunner