我试图覆盖save()
方法,以便类views
的字段Category
仅接受正数或零。 (这是Tango with Django 1.7 Chapter 20)
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 :(得分:1)
cat
是python中的一个对象。除非您明确更改它,否则它不会发生变化。您的数据库中没有cat
,您的测试应该是:
self.assertEqual(Category.objects.count(), 0)
但是变量cat
将在您创建它时存在于该范围内。
当您测试cat.views
时,它只会检查您刚创建的views
实例中的cat
字段的值。这与您的数据库无关。
答案 1 :(得分:0)
你可以轻松做几件事。第一点是
如果你只想在这个模型中使用正整数,你可以在Django中使用正整数字段
如果您想要自定义方式,请提出异常或使用assert语句。然后在测试用例中可以检查是否引发了异常或断言错误