コントローラーの単体テストを書くのはなぜですか?


22

私にとってこれはまったく無関係な単体テストであり、それを得る価値はほとんどないため、なぜ誰かがそれを書くのに時間を費やすのか理解できません。このコントローラーがブラウザーでメソッドを実行することで必要な型を返した場合、私は完全によく知っているでしょう。本当に、これにはテストが必要だと思いますか、それはなぜですか?

public class ConstituencyControllerTests
{
    private ConstituencyController _constituencyController;
    private Mock<IConstituencyService> _IConstituencyServiceMock;

    public ConstituencyControllerTests() {
        _IConstituencyServiceMock = new Mock<IConstituencyService>();
    }

    [Test]
    public async Task I_Check_For_Return_Type_And_Result() {
        _constituencyController = new ConstituencyController( _IConstituencyServiceMock.Object );

        var result = await _constituencyController.Get();
        var content = ( (dynamic)result ).Content;

        Assert.IsEmpty( content );
        Assert.IsInstanceOf( typeof( System.Web.Http.Results.OkNegotiatedContentResult<IEnumerable<ListOfConstituencies>> ), result );
        _IConstituencyServiceMock.Verify( x => x.ListOfConstituencies(), Times.Once() );
    }
}


7
@gnatに同意しないでください。これは、必ずしも言語構造に関するものではなく、コントローラーによって返される結果の型に関するものです。継承階層がない場合は同じものになりますが、コントローラーが祖先が返されることを期待している場合、まったく異なる獣になり、コントローラーはPersonを返し、PersonはAncestorではなくPeopleAncestorから下降するように変更されます...また、そのようなメソッドをテストするのが良い考えかもしれない理由に答えます;;)単体テストは、あるものの変更が他の何かを壊すような状況で拾うことを意図しています。
マルジャンヴェネマ16


同意する傾向がありますが、私は通常、アプリケーションのエントリポイントの単体テストにあまり時間をかけません。コンソールアプリケーションのメインメソッドを単体テストするようなものです。私にはほとんど意味がありません。
Mvision

回答:


29

彼らのキーポイントはこちらです:

このコントローラーがブラウザーでメソッドを実行することで必要な型を返した場合、私は完全によく知っているでしょう

ユニットテストについて 単純なコードユニットをテストする非回帰の自動化であり、自分自身を見ることではありません。アプリケーションで常にユニットテスティングを実行する必要はありません。

編集:@anotherdaveコメントの追加:

スケーリングの容易さについてです。ブラウザーで1つのコントローラーをテストしても問題ありません。10、20、50コントローラーはどうですか?テストを1回作成します。コントローラーの変更時に更新する必要がある場合がありますが、これはオーバーヘッドです。しかし、どのくらいの頻度で展開しますか?確かに、テストよりもはるかに多くのオーバーヘッドがあるたびに手動でチェックします

の代替として @Vladislavの答えに、ユニットテストは絶対にやり過ぎであり、本当に望ましくない場合があります。より軽いものが必要な場合は、Seleniumを使用して高レベルの非回帰テストを実行できます。確かに、単体テストよりも少ないカバレッジが得られますが、単体テストを行う時間を大幅に短縮し、より柔軟な妥当なカバレッジを得ることができます。

つまり、すべてを単体テストする場合、単純な要素を変更するたびに1つ以上のテストを更新する必要があります。


4
また、re:を追加するI would know perfectly well if this controller returned the wanted type by executing the method in a browser.ことは、スケーリングの容易さについてです。ブラウザーで1つのコントローラーをテストしても問題ありません。10、20、50コントローラーはどうですか?テストを1回作成します。コントローラーの変更時に更新する必要がある場合がありますが、これはオーバーヘッドです。しかし、どのくらいの頻度で展開しますか?確かに、テストよりもはるかに多くのオーバーヘッドがあるたびに手動でチェックします。
anotherdave 16

「ユニットテストは自動化に関するものです」-正しいですが、統合テスト(Selenium / Webdriver / etc。)もそうです。統合テストよりも単体テストの方が実装が速いのは、必ずしもそれほどカットアンドドライだとは思いません。多くはアプローチに依存しますが、効果的な単体テストを取得するには、それぞれに行われる多数の異なるサービスと呼び出しをモックアウトする必要がある場合、統合テストは実装が速く、維持が簡単です(一般的に実行がはるかに遅い、はい) 。ポイントは、多くはコンテキストとテスト対象のコードの複雑さに依存します。
アロス

@anotherdaveコメントが追加されました
ウォルフラット

@aroth私のポイントは反対でした、完全なユニットテストコードは多くの時間がかかり、ユニットテストを変更することなくコードを変更するのが非常に難しいものです。統合テストが軽くなりました。もちろん、非常に複雑な単体テストが必要ですが、その部分を単体テストするためではなく、すべてを単体テストする必要があります。それでも、彼が存在しない銀の弾丸を探している人々を見ます。
ウォルフラット16

24

コントローラーの単体テストを書くのはなぜですか?

コンテキストを知らないと、これまたはそれをテストする必要があるかどうかを確実に言うことができないからです。コントローラーをテストする理由はいくつかあります。

  • コントローラには、エラーが発生しやすい複雑なサービス配線ロジックが含まれている場合があります。サービス自体は正常に動作する可能性があります。テストしたい結果であり、何らかの理由でアプリにオーケストレーションレイヤーを導入しないことを検討しました
  • コントローラーにはアプリケーションのビジネスロジック全体が含まれ、コントローラーは実際にテストできるすべてです(理想的なコードベースで作業したすべての人生を見せないでください、そのようなコードベースがあります、信じてください)
  • あなたのチームは99%の天才と1%の平均的な人々で構成されており、その1%を給与のバグから守りたい

2
私は追加します。「あなたはプロジェクトを取り除くために起こっている将来的に誰が予見できず、テストは自己文書化されたコードの一部である」
LAIV

4
中間点まで、テストを念頭に置かずに作成されたプロジェクトは、モックなしのコントローラーテスト以外の方法ではテストできません。私はそのようなプロジェクトを丁寧に管理しているC#チームと仕事をしているので、きめ細かいテストを行えるように必要な構造(インターフェイスなど)を追加できるまでコントローラーテストを書いています。
ウェインコンラッド

1

私はOPに完全に同意します。

コントローラーの単体テストは無意味です。コントローラーを回帰テスト(たとえば、Seleniumを使用)で暗黙的にテストします。

コントローラーが使用するすべてのコンポーネント/オブジェクトをTDDし、コントローラーをできるだけ薄くする必要があります。その後、すべてが適切に単体テストされます。確認したいのは、Web要求を実行するときにすべてがうまく機能することです。それが回帰テストです。


そうかもしれませんが、それは質問への答えではありません。実際、ここでは単体テストの使用に反対する議論です。
JᴀʏMᴇᴇ

「これにはテストが必要だと思いますか?」という質問に答えたと思います。
winkbrace

はい、@ winkbraceと私はこれについて同じ考えを共有していると思います。しかし、それはユニットテストではなく、何をテストすべきかについての議論でもあると思います。人々はあまりにも多くのことをテストし、「間違った」ことをしていると思います。私の例では、コントローラーのテストは非常に薄く、サービスを取り巻くテストがあるとよいので、ほとんど価値がありません。ここでのすべての答えは意味があり、良い点がありますが、正しい答えとしてマークすることは実際には不可能です。
フロスティング

コントローラーロジックは、個々のコンポーネントの単体テストとは別に、自動化された統合テストを使用してテストできます。
KevBurnsJr

-1:コントローラーの単体テスト無意味です。コントローラーは変換に関するものですが、場合によっては変換自体が複雑であり、開発者がそれをカバーしたい場合があります。また、ユニットテスト1)は最終的に実装の検証に関するものであり、必ずしも高レベルの動作を検証するものではなく、2)高速であると想定されていると思います。両方の品質により、実装時の単体テストがより便利になります。言い換えれば、それらは最終的に開発者のツールであり、偶然にも製品の品質を検証する方法です。
rsenna
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.