2017-03-06 24 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

私は別個のSeleniumテストスイートを持っているので、そこでテストすることができます。だから正しく理解すれば、何らかの種類の論理(リストの理解など)が含まれていない限り、テストクラスの属性をユニット化する必要はありません。 – rubick

関連する問題