Тестирование модели Django бросает TypeError
Я пытаюсь протестировать свой REST API и в настоящее время тестирую свои модели. Я очень новичок в Django и в тестировании в частности.
При тестировании моих моделей я продолжаю получать эту ошибку:
TypeError: Field 'id' expected a number but got datetime.datetime(2022, ...)
Я получаю эту ошибку для каждой модели и представления до сих пор.
Почему возникает эта ошибка? Как я могу заставить мои тесты для этой модели работать? Правильно ли я вообще тестирую?
Это одна из моих моделей:
class Tag(models.Model):
name = models.CharField(max_length=256)
language = models.CharField(max_length=256)
objects = models.Manager()
def __str__(self):
"""Return a human readable representation of the model instance."""
return self.name or ''
@property
def tags(self):
tags = self.tagging.values('tag')
return tags.values('tag_id', 'tag__name', 'tag__language')
А вот соответствующий набор тестов для этой модели:
class TagTests(TestCase):
def setUp(self):
self.tag_name = "name of the tag"
self.tag_language = "language of tag"
self.tag = Tag.objects.create(name=self.tag_name, language=self.tag_language)
def test_name_label(self):
tag = Tag.objects.get(id=1)
field_label = tag._meta.get_field('name').verbose_name()
self.assertEqual(field_label, 'name')
def test_tag_size(self):
tag = Tag.objects.get(id=1)
max_length = tag._meta.get_field('name').max_length
self.assertEqual(max_length, 256)
def test_str(self):
"""Test for string representation"""
tag = Tag().objects.get(id=1)
self.assertEqual(str(tag), tag.name)
def test_model_can_create_tag(self):
"""Test the tagging model can create a tag instance"""
old_count = Tag.objects.count()
self.tag.save()
new_count = Tag.objects.count()
self.assertNotEqual(old_count, new_count)
Я не вижу места, где вы передаете datetime объект как id.
Но...
Я заметил несколько принципиальных ошибок:
tag = Tag().objects.get(id=1)
Вы создаете объект Tag с помощью ().
Еще один момент. Если вы создаете self.tag = Tag.objects.create() в SetUp, то модель создается для каждого теста в TestCase. Это означает, что вы не можете get объект с ищущим (id=1), потому что база данных одна и та же, но в SetUp она создает новый объект с новым id. Таким образом, вместо:
def test_str(self):
tag = Tag.objects.get(id=1)
self.assertEqual(str(tag), tag.name)
Вам следует просто использовать гораздо более безопасный подход:
def test_str(self):
self.assertEqual(str(self.tag), self.tag.name)
Старайтесь "жестко кодировать" как можно меньше в тестах.