簡単に言えば、Asp.Net Web フォーム サーバー コントロールが動的コンテンツを構築するときに、正しい Html を出力していることをテストできるようにしたいと考えています。コントロールの作成を始めたばかりで、出力を取得する Html を構築する TDD スタイルで作成したいと考えていました。
通常の Asp.Net パイプラインの外部で分離してテストできるように、実際の Html ビルドを行う別のクラスを作成しました。
単体テストでは、返される html を制御できますが、期待しているマークアップが html に含まれていることを確認するのに問題があります。
<div id="wrapper">
<div id="fields">
</div>
<div id="main">
</div>
</div>
Nunit を使用しているので、サーバー コントロールからの出力を保存し、次のように Is.StringMatching を使用してテストできるようにしたいと考えています。
Assert.That(output, Is.StringMatching("<div id=\"main\">.*?</div>"));
残念ながら、出力される余分な \r \n \t 命令のため、これは機能しませんHtmlTextwriter
。
私が現在それを使用している方法は、を作成しStringWriter
、それを使用して次のHtmlTextWriter
ように作成することです。
stringWriter = new StringWriter();
htmlTextWriter = new HtmlTextWriter(stringWriter);
次に、次のメソッドを呼び出します。
public string Build(HtmlTextWriter writer)
{
writer.AddAttribute(HtmlTextWriterAttribute.Id, "wrapper");
writer.RenderBeginTag(HtmlTextWriterTag.Div);
writer.AddAttribute(HtmlTextWriterAttribute.Id, "fields");
writer.RenderBeginTag(HtmlTextWriterTag.Div);
writer.RenderEndTag();
writer.WriteLine();
writer.AddAttribute(HtmlTextWriterAttribute.Id, "main");
writer.RenderBeginTag(HtmlTextWriterTag.Div);
writer.RenderEndTag();
writer.RenderEndTag();
return writer.InnerWriter.ToString();
}
Html がより複雑になるにつれて、出力が正しいことを確認する際にさらに問題が発生することが予想されます。
追加の制約は、CI サーバー (ほとんどの場合 TeamCity) を介してテストを実行できるようにするための要件であるため、すべてのコードまたは参照ライブラリをソリューションに配置する必要があります。
私はかなりのグーグルをしましたが、Html出力をテストする方法について多くを見つけることができないようです.誰でも最善の方法について何か提案を提供できますか?