Django测试用例

时间:2015-09-10 21:52:04

标签: python django

我正在学习如何使用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类中定义。如何解决这个错误?感谢。

2 个答案:

答案 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)