回答:
はい、できます。懸念をうまく分離するように注意する必要があります。つまり、コードビハインドからすべてのロジックを削除し、他のクラスに配置する必要があります。
これを行うには、2つの一般的な方法があります。
簡単な方法は、「システムはどのような情報を提供しますか?ページにどのような情報を入力する必要がありますか?」という観点からすべてのイベントハンドラを再考することです。そして、その変換を行うサービスクラスを提供します。
この場合、サービス層はプレゼンテーション層の性質についてほとんど知る必要がありません。サービスから返されたデータを取得して、コードビハインドにWebFormの正しいコンポーネントを入力する必要があり、これはテストされません(少なくとも単体テストでは、統合テストを使用できます)。しかし、これはコードがうまくいかない場合はめったになく、ロジックで失敗する可能性がはるかに高いです。
より複雑ですが、より効果的な方法は、モデルビュープレゼンターパターンを使用することです。それを試してみると、プレゼンターはすぐにフレームワークと非常に連動するようになり、MVPを開発すればするほど、MVPは本当にMVCになりたかったが、できなかったことが明確になりました。
とはいえ、他の人はこれを非常にうまくやっています-webformsmvpフレームワークさえあれば、重いものを取り除くことができます-あなたの走行距離は変わるかもしれません。
明らかに、Webフォームページ全体はユニットではないため、ユニットテストを行うことはできません。ただし、自動テストのためにできることがいくつかあります。
質問の「ユニット」の部分をなくしてすみません...
SeleniumHQは、フロントエンドからのテストの友です。ブラックボックステストのような、ユニットテストではありません。あなたはまだ有効なテストケースを考える必要があります...
単体のWebテストは、リグレッションバグまたは新しいプロジェクトの一般的なアイデアを伝えるためだけのものであっても、非常に便利だと思います。
状態に関する限り、非UIテストの場合と同じようにユニットテストを作成します。テストの開始時にデータベースをクリアし、データベースを再構築して開始状態以外の情報を含めません。各ユニットテストは、単一のページ、または通常はページ上の個別のタスクをカプセル化します。
http://watin.org/は別のWebテストツールですが、C#/。NET用です。テストは単体テストとして記述します。
[Test]
public void SearchForWatiNOnGoogle()
{
using (var browser = new IE("http://www.google.com"))
{
browser.TextField(Find.ByName("q")).TypeText("WatiN");
browser.Button(Find.ByName("btnG")).Click();
Assert.IsTrue(browser.ContainsText("WatiN"));
}
}
現在IEベースですが、FirefoxとChromeの実験的なサポートがあります。Javascriptインタラクションなど、手動テストで行うことはほとんどすべて自動化できます。
Webリクエストが有線(またはTCPスタック経由)で発生するため、Webサイトを実際に単体テストすることはできません。したがって、テストは「単体テスト」の定義に適合せず、エンドツーエンドのテストになる可能性があります。
これらの種類のテストでは、Seleniumなどのスイートを使用して、バックグラウンドでWebブラウザーを実行できます。しかし、警告の言葉:通常、この種のテストは非常に困難であり、多くの可動部分があるため予測不可能です!
さらに興味深いことに、Webフォームをまったくテストする必要がある理由が少し心配です。コードビハインドにあまりにも多くのロジックを入れすぎて、万が一の貧弱なビジネスロジックがありませんか?
過去5年間、Jasmineはフロントエンドの単体テストの主要ツールとして登場しました。Nodeとnpmを使用した自動ビルドテストに組み込まれることがよくあります
https://en.wikipedia.org/wiki/Jasmine_(JavaScript_testing_framework)ごと:
JasmineはJavaScript用のオープンソーステストフレームワークです。[2] JavaScript対応のプラットフォームで実行し、アプリケーションやIDEに侵入しないようにし、読みやすい構文にすることを目指しています。これは、ScrewUnit、JSSpec、JSpec、RSpecなどの他のユニットテストフレームワークの影響を大きく受けています。[3]
JavaScriptについてのすべての言及にもかかわらず、プレーンなWebフォームの単体テストにも使用できます。