2013-12-13 9 views
9

MVCアプリケーションでいくつかのテストを実行しようとしていますが、問題が発生しています。私は右のポイントを取得しようとするでしょう:HttpApplication/HttpContextを模擬する方法

私はこのような何かしようとするRhinoMocksを使用しています:

セットアップ:

public static HttpContextBase FakeHttpContext(this MockRepository mocks) 
{ 
    HttpApplication app = mocks.PartialMock<HttpApplication>(); 

    HttpContextBase context = mocks.PartialMock<HttpContextBase>(); 
    HttpRequestBase request = mocks.PartialMock<HttpRequestBase>(); 
    HttpResponseBase response = mocks.PartialMock<HttpResponseBase>(); 
    HttpSessionStateBase session = mocks.PartialMock<HttpSessionStateBase>(); 
    HttpServerUtilityBase server = mocks.PartialMock<HttpServerUtilityBase>(); 

    SetupResult.For(context.ApplicationInstance).Return(app); 

    SetupResult.For(context.Request).Return(request); 
    SetupResult.For(context.Response).Return(response); 
    SetupResult.For(context.Session).Return(session); 
    SetupResult.For(context.Server).Return(server); 

    mocks.Replay(context); 
    return context; 
} 

MockRepository mocks = new MockRepository(); 
HttpContextBase _mockContext = mocks.FakeHttpContext(); 
mocks.SetFakeControllerContext(new LoginController()); 
HttpApplicationStateBase appState = MockRepository.GenerateStub<HttpApplicationStateBase>(); 
_mockContext.Expect(mc => mc.Application).Return(appState); 
HttpContext.Current = _mockContext.ApplicationInstance.Context; 

をここでFakeHttpContext()方法です

私は本当にHttpContextBase.Request.AppRelativeCurrentExecutionFilePathにアクセスする必要がありますが、それはいつもnullとして返されます。 HttpContext.Current.Request.RequestContextも同様です。

誰でも私をここで助けることができますか?この時点で私は絶望的だと言っても間違いない。

+0

ます問題が何であるか教えてください。あなたはエラーを受け取りますか(どちらですか?)私が見る限り、特定のセットアップ 'Setup(c => c.Request。AppRelativeCurrentExecutionFilePath) 'は、' Request'が 'virtual'プロパティ' AppRelativeCurrentExecutionFilePath'を持つ型の 'virtual'プロパティであるために動作します。 '_mockContext.SetupAllProperties();'と言った理由は?他の*プロパティも同様に設定したいと思っていますか? –

+0

@JeppeStigNielsen私は今使っているもので質問を更新しました。私はまだそれを働かせることはできません。 – Kehlan

答えて

1

まず最初に、HttpContext.Currentの使用を避けてください。静的メソッドを使用すると、今すぐ見つけたようにテストするのがずっと難しくなります。依存性注入フレームワークを使用している場合は、コンストラクタにHttpContextBaseを注入します。 FakeHttpContext()であなたの実際の問題のために

は、

HttpRequestBase request = mocks.PartialMock<HttpRequestBase>(); 

HttpRequestBase request = mocks.GenerateStub<HttpRequestBase>(); 

を変更しようと、あなたのテストでは、あなたがこのような何か行うことができます。

_mockContext.Request.Stub(x=> x.AppRelativeCurrentExecutionFilePath).Return("foo"); 
var result = object.DoSomething(); 
Assert.AreEqual("foo",result); 

IドンあなたがfraをテストするようにHttpContextを部分的に嘲笑することは非常に便利だと思いますその代わりに(すなわち、フレームワークがHttpContextの値YとZに基づいて正しい値Xを返すかどうかをテストしてください)

もう1つの方法は、計算された値を返すHttpContextBaseの周りにラッパークラスを作成することです。例えば。 HttpContextBaseWrapper.AppRelativeCurrentExecutionFilePath(),HttpContextBaseWrapper.RequestIpAddress()。これにより、HttpContextBaseと詳細を嘲笑することを心配する必要がないので、他のすべてのクラスのテストが複雑にならず、HttpContextBaseWrapperクラスをモックする必要があります。

編集:

私は同様にあなたのHttpRequestContextを注入するために、あなたをもお勧めしますが、それが不可能な場合は、あなたがFakeHttpContext方法でそうのようにRequestContextのスタブすることができます

var requestContext = MockRepository.GenerateStub<RequestContext>(); 
request.RequestContext = requestContext; 
+0

私は本当にこの答えに感謝します。私は別の問題にぶつかったので、OPを編集しました。また、 'HttpContext.Current.Request.RequestContext'をモックする必要があります。あなたもそれで私を助けてくれるチャンスですか? – Kehlan

+0

RequestContextをスタブできるように私の答えを更新しました。 –

+0

'HttpRequestContext'が何であるかわかりません。 'RequestContext'を意味すると仮定します。もう一度ありがとう!私はそれを試して、それがどのように行くか見る。 – Kehlan

1

なぜHttpContextベースの呼び出しを含む抽象クラスを作成しないのですか?

public class MyClass 
{ 
    private readonly IHttpContext _httpContext; 
    MyClass(IHttpContext httpContext) 
    { 
     _httpContext = httpContext; 
    } 

    public void Blaat() 
    { 
     _httpContext.DoYourThingsWithTheHttpContext(); 
    } 
} 

は、そうでない場合は、マイクロソフトから偽物とスタブフレームワークを見て、あなたが依存性注入を使用していると仮定すると:

次に、あなたがこのような何かを行うことができます。