web-dev-qa-db-ja.com

クラスが作成するHTML出力をテストするにはどうすればよいですか?

学習プロジェクトとして、ASP.NET MVCに付属するWebGridに似たものを作成しようとしています。今、このコンポーネントMyGrid<T>は次のようになります。

public class MyGrid<T> where T : class
{
  public MyGrid(IEnumerable<T> dataSource) { ... }
  public bool AutoGenerateColumns { get; set; }
  public MvcHtmlString HtmlMarkup { get; }
  // some more stuff
}

これまでに、グリッドの基本的な機能をテストするテストをいくつか作成し、いくつかの例外がスローされていないかどうかを確認しました。しかし、それがMvcHtmlStringであるので、正しい出力をどのようにテストするのが最善かと思います。空のグリッドを確認する方法の例は、次のテストです。

[TestMethod]
public void AutoGenerateColumnsFalseProducesEmptyTableWhenNoColumnsAreSpecified()
{
  var grid = new MyGrid<object>(new object[] { "a", "b" });
  grid.AutoGenerateColumns = false;
  string markup = grid.HtmlMarkup.ToHtmlString();
  XDocument xdoc = XDocument.Parse(markup);

  XElement table = xdoc.Descendants().First();
  Assert.IsTrue(table.Name == "table");

  // children: thead, tbody, tfoot
  foreach (XElement child in table.Descendants())
  {
    Assert.IsFalse(child.HasElements);
  }
}

これは私にはかなり不格好なようですが、ここでXDocumentを使用してこれをテストする良い方法であるかどうかはわかりません。マークアップを作成するには、代わりにTagBuilderを使用します。

したがって、空のグリッドをチェックすることは、私が望んでいるほど短く/エレガントではありません。このテストを改善するためのヒントは大歓迎です。しかし、正しい出力を確認するなど、より複雑なものをテストするにはどうすればよいですか?

TagBuilderは空白を生成するように見えるので、テストする1つの方法は、すべての空白の出力を取り除いてから、手書きのHTML文字列と比較することです。しかし、これも非常に不格好なように見えます(そして、私の側に入力ミスの余地がたくさん残っています)。

(より複雑な)HTML出力が正しいかどうかをテストする方法について何か提案はありますか?出力を解析するためのXDocumentよりもエレガントで優れた方法はありますか?

7
InvisiblePanda

より近代的なアプローチは、HTML Agility Packを利用することです。構文は、JQueryのようなJSライブラリにあるdomの選択に近いです。

次に例をいくつか示します。

これはNugetパッケージとしてロードすることもできます。

2
Kyle J V