我正在学习如何使用Django测试基础设施。很多时候,很难找到一个好的测试用例。
以下是Tango中使用Django教程的一个测试用例。
class CategoryMethodTests(TestCase):
def test_ensure_views_are_positive(self):
"""
ensure_views_are_positive should results True for categories where views are zero or positive
"""
cat = Category(name='test',views=-1, likes=0)
cat.save()
self.assertEqual((cat.views >= 0), True)
这是models.py
中的Category类class Category(models.Model):
name = models.CharField(max_length=128, unique=True)
views = models.IntegerField(default=0)
likes = models.IntegerField(default=0)
slug = models.SlugField(unique=True, default=uuid.uuid1)
def save(self, *args, **kwargs):
self.slug = slugify(self.name)
super(Category, self).save(*args, **kwargs) #python MRO
def __str__(self):
return self.name
我将此行添加到保存方法
def save(self, *args, **kwargs):
self.slug = slugify(self.name)
if self.views >=0:
super(Category, self).save(*args, **kwargs) #python MRO
测试用例仍然失败。有两个问题: 1.如何使测试用例通过; 2.如何处理else案例(self.views< 0)?
感谢Alasdair的快速回答。
随访: 我正在测试名为“索引”视图的主页。以下是测试代码:
class IndexViewTests(TestCase):
def test_index_view_with_no_categories(self):
response = self.client.get(reverse('index'))
self.assertEqual(response.status_code, 200)
self.assertQuerysetEqual(response.context['categories'], [])
def **add_category**(name, views, likes):
c = Category.objects.get_or_create(name=name)[0]
c.views = views
c.likes = likes
c.save()
def test_index_view_with_categories(self):
add_category('test', 1, 1)
add_category('temp', 1, 1)
add_category('tmp', 1, 1)
add_category('tmp test temp', 1, 1)
response = self.client.get(reverse('index'))
self.assertEqual(response.status_code, 200)
self.assertContains(response, "tmp test temp")
num_cats = len(response.context['categories'])
self.assertEqual(num_cats, 4)
当我运行测试用例时,它失败了:
add_category('test',1,1) NameError:未定义名称“add_category”
add_category在IndexViewTests类中定义。如何解决这个错误?感谢。
答案 0 :(得分:0)
您已更改save()
方法,以便在视图大于或等于零时仅将对象保存到数据库。
但是,测试是检查对象的值,对象是否保存到数据库并不重要。
要使测试通过,我会尝试检查save方法中的视图数。如果它小于零,则将其改为另一个数字(例如零)。最后,在if语句之外调用save()
方法。
答案 1 :(得分:0)
最终这个版本较旧,但是从未显示过正确的答案(对于那些只想要正确答案的人来说很烦人)本教程/书籍系列中有一些因为过时的指令(如twitter boostrap版本 - 可能会侧身)玩得开心)..这只适用于save()方法
def save(self, *args, **kwargs):
if self.views < 0:
self.views = 0
self.slug = slugify(self.name)
super(Category, self).save(*args, **kwargs)