2015-04-22 5 views
0

Я пытаюсь переопределить метод save(), так что поле views класса Category принимает только положительные числа или ноль. (Это упражнение из Tango with Django 1.7 Chapter 20)Django: переопределение метода save() в модели

models.py:

class Category(models.Model): 
    name = models.CharField(max_length=128, unique=True) 
    views = models.IntegerField(default=0) 
    like = models.IntegerField(default=0) 
    slug = models.SlugField(unique=True) 

    def save(self, *args, **kwargs): 
     self.slug = slugify(self.name) 
     if self.views < 0: 
      return 
     else: 
      self.slug = slugify(self.name) 
      super(Category, self).save(*args, **kwargs) 

    def __str__(self): 
     return self.name 

    class Meta: 
     verbose_name_plural = "Categories" 

test.py:

class CategoryMethodTests(TestCase): 
    def test_ensure_views_are_positive(self): 
     """ 
     ensure_views_are_positive should return True for categories where views are zero or positive 
     """ 
     cat = Category(name='test', views=-1, like=0) 
     cat.save() 
     self.assertEqual((cat.views >= 0), True) 

Даже если я добавил условие if self.views < 0 в models.py тест не пройден:

Creating test database for alias 'default'... 
F 
====================================================================== 
FAIL: test_ensure_views_are_positive (rango.tests.CategoryMethodTests) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/home/pm/tango_project/rango/tests.py", line 11, in test_ensure_views_are_positive 
    self.assertEqual((cat.views >= 0), True) 
AssertionError: False != True 

---------------------------------------------------------------------- 
Ran 1 test in 0.001s 

FAILED (failures=1) 
Destroying test database for alias 'default'... 

Где проблема?

+0

Почему self.assertEqual() использовать self.assertTrue(), и Django имеет PositiveIntegertField https://docs.djangoproject.com/en/1.8/исй/модель/поле/# positiveintegerfield –

ответ

1

cat - объект в python. Он не изменяется, если вы явно не измените его. Ваша база данных не будет иметь cat в нем, и ваше испытание должно быть:

self.assertEqual(Category.objects.count(), 0) 

Но переменная cat будет существовать в том объеме, как вы создали его, тем не менее.

Когда вы тестируете cat.views, он проверяет только значение поля views в экземпляре cat, который вы только что создали. Это не имеет ничего общего с вашей БД.

0

Есть несколько вещей, которые вы могли бы сделать легко. Первая точка

  • можно использовать Положительное целое поле в Django, если вы хотите только положительное целое число в этой модели

  • , если вы хотите сделать пользовательский путь, пожалуйста, поднимите исключение или использование утверждение для него. Тогда в тесте может проверить возникает ли исключение или утверждение ошибки