6

Web の現在の http コンテキストをサービス クラスに渡す (またはそれへの参照を使用してクラスを初期化する) 方法を考え出そうとしています。これを行っているのは、アプリの残りの部分を、http コンテキストについて何も知る必要がないように抽象化するためです。

また、おそらく Mockable フレームワークの 1 つを使用して、TDD を使用してサービスをテストできるようにしたいと考えています。したがって、実際のクラスではなくインターフェイスを使用することをお勧めします。

私が達成したいことの例:

class WebInstanceService 
{
    private IHttpContext _Context;        

    public WebInstanceService( ... , IHttpContext HttpContext )
    {
        ....
        _Context = HttpContext;
    }

    // Methods...
    public string GetInstanceVariable(string VariableName)
    {
         return _Context.Current.Session[VariableName];
    }
}

私が抱えている主な問題の 1 つは、IHttpContext がないことです。.net http コンテキストは、(簡単に?) モックできない抽象クラスのサブクラスです。

もう 1 つの問題は、クラスのグローバル インスタンスを初期化できないことです。これは、コンテキストがほとんどの要求に関連しないためです。

クラスを静的にし、コンテキストが呼び出されるたびに各関数に渡されるようにすることができます。

public static string GetInstanceVariable(string VariableName, HttpContext Context) 
{ ... }

しかし、これによってクラスのテストが容易になるわけではありません。HttpContext を作成する必要があります。さらに、このクラスを使用したい非 Web 対応サービスは、突然 Context を取得できる必要があり、密接に結合する必要があります。 Web サーバーへ - そもそもこのクラスを作成したい理由のすべてです。

私はすべての提案にオープンです - 特に人々が簡単な tdd テストを容易にすることを知っている提案です。この問題にどのように取り組むことを人々は提案しますか?

乾杯

4

3 に答える 3

3

これが、HttpContextBase と HttpContextWrapper が導入された理由です。おそらく HttpContextBase を使用し、実際のコンテキストを渡すときに を使用new HttpContextWrapper( httpContext )することをお勧めしますが、コントローラーで使用できるものは既に HttpContextBase 型であると思います。静的でグローバルな HttpContext.Current インスタンスから現在のコンテキストを参照しようとするのではなく、毎回コントローラーでこれらのいずれかを作成します。ビューで必要な場合は、ViewData で厳密に型指定されたコンテキストへの参照を渡します。

テストで HttpContextBase を頻繁にモックアップします。

class WebInstanceService 
{
    private HttpContextBase _Context;        

    public WebInstanceService( ... , HttpContextBase HttpContext )
    {
        ....
        _Context = HttpContext;
    }

    // Methods...
    public string GetInstanceVariable(string VariableName)
    {
         return _Context.Session[VariableName];
    }
}
于 2008-12-02T13:10:27.837 に答える
1

私たちがしているのは、これらのいずれかをスピンアップすることですhttp://haacked.com/archive/2007/06/19/unit-tests-web-code-without-a-web-server-using-httpsimulator.aspx

パイのように簡単です。HttpSimulator をインスタンス化して値を入力するだけで、HttpContext.Current は指定したもので満たされます。

IHttpContext は MVC にあるものであり、明らかにいつか Web フォームになるでしょう。その日が .net 4 になることを願っています

于 2008-12-02T13:11:14.107 に答える
1

ASP.NET には、テスト状況で HttpContext を処理するために使用できる HttpContextBase を含む System.Web.Abstractions が付属しています。

個人的には、HttpContext への直接的な依存関係を抽象化します。

于 2008-12-02T13:12:41.700 に答える