7

私はしばらくの間、ASP.NET MVC で UserViewControl の単体テストを作成しようとしています。次のようなコードを取得したいと思います。

[TestMethod]
public void HaveControlToDisplayThings()
{
    var listControl = new ControlUnderTest();
    var viewData = new ViewDataDictionary<IList<string>>(this.repo.GetMeSomeData());

    // Set up a ViewContext using Moq.
    listControl.SetFakeViewContext(viewData);
    listControl.ViewData = viewData;
    listControl.RenderView(listControl.ViewContext);

    // Never got this far, no idea if this will work :)
    string s = listControl.ViewContext.HttpContext.Response.Output.ToString();
    Assert.AreNotEqual(0, s.Length);
    foreach (var item in this.repo.GetMeSomeData())
    {
        Assert.IsTrue(s.IndexOf(item) != -1);
    }
}

残念ながら、何を試しても、RenderView の奥深くからエラーが発生します。これは、(私が知る限り)静的 HttpContext.Current オブジェクトが役に立たないことが原因です - I get NullReferenceExceptions from System.Web.UI.Page.SetIntrinsics.

Phil Haack のHttpSimulatorHttpBrowserCapabilitiesを使用して HttpContext オブジェクトを取得しようとしましたが、さらに少し進めるには偽のオブジェクトを指定する必要があることもわかりました。

Subtext.TestLibrary.HttpSimulator simulator = new HttpSimulator();
simulator.SimulateRequest();
var browserMock = new Mock<HttpBrowserCapabilities>();
browserMock.Expect(b => b.PreferredRenderingMime).Returns("text/html");
browserMock.Expect(b => b.PreferredResponseEncoding).Returns("UTF-8");
browserMock.Expect(b => b.PreferredRequestEncoding).Returns("UTF-8");
HttpContext.Current.Request.Browser = browserMock.Object;

これで、そのオブジェクトのプロパティ アクセスで例外が発生します。私はできる限り多くの人を嘲笑しましたが、どこにも速くなっていないようでした.

誰かがこれを機能させることができましたか?

4

6 に答える 6

3

残念ながら、ASP.NET ビューエンジンは、ASP.NET ホスティング環境で VirtualPathProvider を使用します。さらに悪いことに、Reflector を使用して他のコードの一部をトレースしたところ、VirtualPath ユーティリティへのハードコード参照には他の依存関係があることがわかりました。ビューとそれらがどのようにレンダリングされるかを実際にテストできるように、リリースでこれが修正されることを願っています。

于 2008-12-23T23:37:08.913 に答える
2

1 つのオプションは、ブラウザー内で単体テストを実行することです。そのような場合、私はSeleniumで成功しました。

于 2008-12-23T23:27:09.527 に答える
2

ビューの単体テストを断念し、現在はビルドの一部として WatiN ブラウザー テストを使用しています。

また、Resharper Solution Wide Analysis を使用して、コンパイラ エラーがあるかどうかを確認します。完全ではありませんが、非常に似た結果が得られます。欠点 - WatiN テストは遅いです。

于 2008-12-23T23:34:32.930 に答える
1

これらは、asp.net webforms サイトを実行するために HttpBrowserCapabilities オブジェクトに設定する必要がある値です。これらが設定されていることを確認し、問題が解決するかどうかを確認します。解決するかどうかはわかりませんが、ちょっと試してみる価値はありますか?

  • ブラウザ(別名)
  • useragent (リクエストで渡される)
  • テーブル (真/偽)
  • version (ブラウザのバージョン 1.0 など)
  • w3cdomversion (例: 1.0)
  • クッキー (真/偽)
  • ecmascriptバージョン (例: 1.0)

お役に立てれば。

于 2008-12-28T22:58:01.610 に答える
1

UIテストにもセレンをお勧めします。標準の MVC アプリケーションには単体テストできるものがかなりありますが、UI レベルのコンポーネントは常に、Selenium のようなブラウザー内テストに適しているように見えました。Cruisecontrol.netを使用して、Selenium テストを単体テストと統合できます。

これは、Selenium を CC.Net に統合するためのガイドです。

于 2008-12-30T15:50:42.580 に答える
1

TypeMock を使用して依存関係をモックします。コントローラー層でリクエストとレスポンスの依存関係をモックアウトする方法について、ブログ投稿を 1 つ書きました。多分それは役に立ちます。

于 2008-12-30T15:55:20.277 に答える