2017-03-06 93 views
2

我想知道什么是单元测试有道Django视图,比如这一个:我应该在单元测试中测试视图的属性吗?

class UserListView(LoginRequiredMixin, ListView): 

    model = get_user_model() 
    template_name = 'users/user_list.html' 
    ordering = 'last_name' 

    def get_queryset(self): 
     self.queryset = self.model.objects.all().annotate(
      full_name=Concat('first_name', Value(' '), 'last_name') 
     ) 
     return super().get_queryset() 

我目前的单元测试的方法get_queryset。这给了我100%覆盖这个观点,但我是否也应该测试,例如,单元测试中的默认排序?还是应该仅在集成/系统测试中进行测试(例如,使用Selenium或Django的客户端)?

一方面,ordering属性是视图的一部分,它影响它的行为,另一方面,它只被第三方代码使用。

回答

1

在我看来,是的,你应该为此添加一个测试。一方面,您可以打赌,Django已经进行了一项测试,确保该属性可以像广告一样工作(Django的测试覆盖率非常高)。

但是,我的推理是这样的:假设上游ListView决定将该属性的名称更改为其他名称。比如,他们将其重命名为list_ordering

快进7个月后,你会碰到Django的版本号来尝试一些闪亮的新功能。编写UserListView现在是一个遥远的记忆。作为一名开发人员,您想知道您要求的默认排序已停止在较新版本的Django中工作,并且此处的失败测试会向您显示 - 它会吸引您注意需要立即更新的某些代码区域。

当然,我们应该在升级第三方库时仔细阅读发布说明,但是更好的是让测试直接与您交谈!

+0

我肯定会测试它,但我的问题是,如果这应该在**单元测试**或集成/系统测试中进行测试。因为这个属性只是第三方代码的某种“预设”,所以我不确定它适合在单元测试中测试,它应该尽可能少地依赖。 – rubick

+1

这取决于你。如果你有一个单独的集成测试套件,那么检查那里的列表排序行为可能会更好,因为这可能只能通过修改第三方代码来实现。单元测试'UserListView'类中存在的属性将毫无意义,因为它会错过最明显的失败模式。 – wim

+0

我有一个单独的硒测试套件,所以我可以在那里测试它。所以如果我理解正确的话,我不需要单元测试类的属性,除非它们包含某种逻辑(例如列表理解),对吧? – rubick