2009-04-21 15 views

答えて

15

RhinoMocksを使用する:

var httpContext = MockRepository.GenerateMock<HttpContextBase>(); 
var httpRequest = MockRepository.GenerateMock<HttpRequestBase>(); 

httpContext.Expect(c => c.Request).Return(httpRequest).Repeat.Any(); 

... set up expectations on request... 

var controller = new MyController(); 
controller.ControllerContext = new ControllerContext(httpContext, 
                 new RouteData(), 
                 controller); 

...invoke action, check assertions... 

httpContext.VerifyAllExpectations(); 
httpRequest.VerifyAllExpectations(); 
11

Moqを使用する:

var request = new Mock<HttpRequestBase>(MockBehavior.Strict); 
request.Setup(x => x.ApplicationPath).Returns("/"); 
request.Setup(x => x.Url).Returns(new Uri("http://localhost/home")); 
request.Setup(x => x.ServerVariables).Returns(new System.Collections.Specialized.NameValueCollection()); 

var context = new Mock<HttpContextBase>(MockBehavior.Strict); 
context.SetupGet(x => x.Request).Returns(request.Object); 

var controller = new YourController(); 
controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), controller); 
11

手動で(私はテストごとのセットアップの8行が必要なモックフレームワークを嫌うので)

// in some common location, only once 
public class MockHttpContext : HttpContextBase 
{ 
    public MockHttpRequest m_request = new MockHttpRequest(); 
    public MockHttpResponse m_response = new MockHttpResponse(); 

    public override HttpRequestBase Request 
    { get { return m_request; } } 

    public override HttpResponseBase Response 
    { get { return m_response; } } 
} 

public class MockHttpRequest : HttpRequestBase 
{ 
    // override whatever bits you want (eg cookies) 
} 

public class MockHttpResponse : HttpResponseBase 
{ 
    // override whatever bits you want (eg cookies) 
} 

// in your specific test 
controller = new YourController { 
    ControllerContext = new ControllerContext { HttpContext = new MockHttpContext() } 
}; 
+0

私はこれが好き。これは嘲笑よりもはるかに理解しやすいです。 m_requestとm_responseが公開されている理由は何ですか? –

+1

です。なぜなら、テストを容易にするために設計された偽のオブジェクトだからです。それらを非公開にすることは、私がそれらを変更したいのであれば(と時々あなたが)私は財産等を持たなければならないということを意味するでしょう。実装の隠蔽のようないくつかのルールは、この種の環境において積極的に有害です –

+0

なぜ私はその質問に答えた後、公開します。リクエストまたはレスポンスのどちらもHttpContextBaseにあるので、セッターはありません。だから私のユニットテストから要求と応答を変更する必要がある場合、私はそれを公開する必要があります。 –

関連する問題