テストMVCビューが眉をひそめているのはなぜですか?


23

現在、ASP.Net MVCアプリケーションの基礎を設定しています。どのような単体テストを作成する必要があるのか​​を検討しています。私は複数の場所で人々が本質的に「あなたの意見をテストすることを気にしないでください、ロジックはなく、簡単で、統合テストでカバーされます」と言ってきました。

これがどのように受け入れられた知恵になったのか理解できません。統合テストは、単体テストとはまったく異なる目的を果たします。何かが壊れた場合、統合テストが壊れた30分後に知りたくないので、すぐに知りたいです。

サンプルシナリオ: Customerエンティティを持つ標準のCRUDアプリを扱っているとしましょう。顧客には名前と住所があります。テストの各レベルで、顧客の取得ロジックが名前と住所の両方を適切に取得することを確認します。

リポジトリを単体テストするために、データベースにアクセスする統合テストを作成します。ビジネスルールを単体テストするために、リポジトリをモックアウトし、ビジネスルールに適切なデータをフィードし、期待される結果が返されることを確認します。

やりたいこと: UIの単体テストを行うには、ビジネスルールをモックアウトし、予想される顧客インスタンスをセットアップし、ビューをレンダリングし、指定したインスタンスの適切な値がビューに含まれていることを確認します。

立ち往生していること: リポジトリの単体テストを行うには、統合テストを作成し、適切なログインを設定し、データベースに必要なデータを作成し、ブラウザーを開いて顧客に移動し、結果のページに適切なものが含まれていることを確認します指定したインスタンスの値。

上記の2つのシナリオにはオーバーラップがありますが、テストのセットアップと実行に必要な時間と労力の主な違いは理解しています。

私(または別の開発者)がアドレスフィールドをビューから削除した場合、統合テストがこれを検出するのを待ちたくありません。私が欲しいのは、毎日複数回行われるユニットテストで発見され、フラグが立てられます。

重要な概念を把握していないように感じます。MVCビューの有効性に関するテストのフィードバックをすぐに望むのはなぜ悪いのか、誰かが説明できますか?(または、悪くない場合は、フィードバックを得るための予想される方法ではありません)


1
"To unit-test the repository, I write an integration test"待って…何?これは、リポジトリの単体テストではありません。テストを自動化していますが、テスト対象のコードにはまだDALとデータベースが含まれています。リポジトリを単体テストするには、ビジネスルールと同じようにリポジトリを分離します。
StuperUser

期待どおりにレンダリングされたビューの単体テストは、テンプレートエンジンが機能することを単体テストするだけです。これは、コンパイルされたCがマシンコードの特定のチャンクを含むユニットテストであり、コードではなくコンパイラをユニットテストするようなものです。
レイノス

2
@Raynos敬具、私は反対する必要があります。私(または別の開発者)が誤ってUIを接続して、UIフィールドのデータ属性を別のデータ属性にレンダリングする場合(たとえば、「姓フィールド」の「名」、テンプレートエンジンとは関係ありません。また、それが明確にのみビューに露出するという問題です。.. DALまたはBRの問題です。
ピーター・ベルニエ

1
@PeterBernierには良い点がありますが、「コンパイラが動作するかどうかをテストする」と「コードが動作するかどうかをテストする」間の行を定義するのは難しいと思います。UIのテストはUIと密接に結びついていることは言うまでもありません。UIを変更すると、テストが失敗します。テストを失敗させることなく、UIのリファクタリングを実際に行うことはできません。
レイノス

回答:


9

ASP.NET MVCでは、シンプルなUIテストは非常に簡単です。基本的にあなたがしなければならないことは、返されたHTMLに必要な要素が含まれていることを断言することです。これにより、HTMLページが期待どおりに構成されますが、UIは完全にはテストされません。

適切なWeb UIテストには、マシン上のブラウザーを使用し、すべてのブラウザーでJavaScriptとHTMLが適切に機能することを確認するSeleniumなどのツールが必要です。Seleniumにはクライアント/サーバーモデルがあるため、Unix、Mac、およびWindowsクライアントを備えた仮想マシンのセットと、それらの環境に共通するブラウザーのセットを使用できます。

現在、適切に設計されたMVC(フレームワークではなくパターン)アプリケーションが、モデルとコントローラーに重要なロジックを配置しています。つまり、これらの2つの側面をテストすると、アプリケーションの機能がテストされます。ビューは表示ロジックのみを持つ傾向があり、視覚検査で簡単に確認できます。ビューのシン処理とアプリケーションの大部分が十分にテストされているため、多くの人はビューレイヤーのテストの苦痛がそれによって得られる利点を上回るとは考えていません。

ただし、MVCには、リクエストによって返されたDOMをチェックするための便利な機能がいくつかあります。これにより、ビューレイヤーのテストの苦痛がかなり軽減されます。


1
「本質的にあなたがしなければならないことは、返されたHTMLに必要な要素が含まれていることを断言することだけです。」これはまさに私がやろうとしていることであり、非自明であることが判明しています。単純にコントロールをレンダリングするのではなく、特定のコントローラーアクションで動作するリンクをポイントできますか?(私はいくつかの評価を行ってきましたが、RenderPartialは大きなオーバーヘッドなしでやりたいことを達成していません。)
ピーターバーニア

mvccontrib.codeplex.com(MVC Contrib)を確認してください。これは、コア言語に組み込まれていないヘルプを提供し、「Test-Drive ASP.NET MVC」(実用的なプログラマー)の本で推奨されていました。ただし、ビューテストにはSeleniumの方が適していると思います。
ベリンロリチュ

TestHelper(MVC Contribの):mvccontrib.codeplex.com/...
Berin Loritsch

Selenium(私の場合はSelenium RC)は、統合テストに使用するものです。私が望むのは、その時点の前に失敗が起こることです。
ピーターバーニエ

2
@Peter:「自明ではない」というあなたの努力についてのあなたのコメントは、ユニットテストビューが嫌われる理由です。そのため、一般的な戦略は、ビューをできる限り薄くする(つまり、ビジネスロジックを含まない)ことで、ほとんどの単体テストを他の場所(通常はViewModelで)で実行できるようにします。ビュー自体は、目視検査によって、またはSeleniumなどのUIテストツールを使用して検証できます。
ロバートハーヴェイ

7

眉をひそめているとは言いません。むしろ、この感情は、aspxビューがWebFormsに非常に依存しているため、MVCビュー(少なくともaspxのさまざまなもの)の単体テストが非常に困難であるという事実の結果です。したがって、意見はそれほど複雑ではない傾向があるため、努力する価値はないという議論があります。

もちろん、ビューは非常に複雑になる可能性があるため、選択します。


3
私が知っている限りでは、ASP.NET MVCビューはWebformに関連付けられていません。ASP.NET MVCの大きなポイントの1つは、Webformではないということではありませんか?
アダムリア

私の見解では、ビューをカバーするための実際の「ユニットテスト」を書くよりも、UIをカバーするための統合テストを書く方が人間の努力を要するということです。だからこそ、私は、ビューの単体テストを書くことに抵抗があると思われるいくつかの抵抗を理解しようとしています。
ピーターバーニエ

@Anna Aspxビューは、WebFormsの上に構築されます。これらはSystem.Web.UI.WebControls.Pageクラスから派生し、<asp:ContentPlaceholder>コントロールを使用します。MVCがそれらを実行する方法は、通常WebFormsに関連付けられた多くのPage実行パイプラインを回避しますが、それでも多くのWebFormsを内部で使用します。
11

別のビューエンジン(カミソリなど)を使用する場合は、Webformsエンジンからさらに遠くに移動できるはずです。
マフィンマン

6

私はそれが眉をひそめているかどうかわからない。テスト容易性は、ASP.NET MVCを使用する主な利点の1つです。チェックアウトスティーブサンダーソンさんのブログをこの詳細は。

彼はまた、手に負えない最高のASP.MVCブック(IMO)を世に出しました。彼はMVCを教えるだけでなく、テストプラクティスなど、MVCに関するベストプラクティスを教えてくれます。

ユニットテストビューについて少し明確にする必要があると考えています。コントローラから返された結果(ActionResultなど)に基づいてユニットテストを構築できます。実際のUIとUIの相互作用については、他のテストを行う必要があります。


「実際のUIとUIの相互作用については、他のテストを行う必要があります。」それがまさに質問の私のポイントです。なぜUIテストが突然「その他のテスト」(つまり、統合テスト)の一部になるのですか。スティーブ・サンダーソンのコンテンツの多くを見て、それが私がこの道を歩み始めたのです。基本的に彼は彼の「MvcFakes」プロジェクトでやっていることを複製しようとし、古いMVCリリース用に書かれたコードの問題に遭遇しました。 。
ピーター・ベルニエ

1

コントローラーアクションによって返されたビューをテストする方法、コントローラーアクションによって返されたビューデータをテストする方法、および次のURLをチェックアウトして、1つのコントローラーアクションが2番目のコントローラーアクションにリダイレクトするかどうかをテストする方法を学習できます。MVCでのビューデータのテストに関するこの短い記事で説明します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.