1

HttpContext オブジェクトに依存するいくつかのメソッドの単体テストを作成しようとしています。次のクラスを思いつきましたが、それが最善の方法だとは思いません。

internal class HttpContextMocking
{

    public static HttpContext Context()
    {

        HttpContext context = new HttpContext(new SimpleWorkerRequest("", "", "", null, new StringWriter()));

        context.Cache.Insert("SomeName", "value", null, DateTime.Now.AddMinutes(3), TimeSpan.Zero);

        return context;
    }

次に、単体テストでこのモック HttpContext を次のように呼び出します。

    [TestMethod]
    [TestCategory("Web")]
    public void Get()
    {
        HttpContext.Current = HttpContextMocking.Context();

        object result = CacheUtility.Get("NonExistentItem");

        Assert.IsNull(result);
    }

これを実装するより良い方法はありますか?ダミーデータを追加し始めると、よりクリーンになります。

4

2 に答える 2

1

HttpContextWrapper および HttpContextBase .NET クラスは、モックの目的で作成されました

于 2012-06-19T16:54:20.083 に答える
1

HttpContext のモックは非常に複雑です。依存関係を、必要なものを提供するインターフェイスに変更し、2 つの実装を用意することをお勧めします。HttpContext を使用する実際の実装と、テスト用のモック実装です。

とにかくそれをモックしたいのに、コードがそのトリックを実行する場合は、そのままにしておきます。

もう 1 つのオプションは、MSTest に ASP.NET ホスト タイプを使用することです。この場合、実際のリクエストを実行し、HttpContext が存在します。

[TestMethod]
[HostType("ASP.NET")]
[AspNetDevelopmentServerHost(@"$(SolutionDir)\Tests", "/")]
[UrlToTest("http://localhost:1234/TestPage.aspx")]
public void MyTest()
{
    Page page = testContextInstance.RequestedPage;
    ...
}
于 2012-06-19T16:24:04.360 に答える