在asp.net MVC中进行单元测试,如何模拟页面请求?

时间:2022-10-30 09:23:29

How do I mock a page request for a .net MVC page?

如何模拟.net MVC页面的页面请求?

3 个解决方案

#1


15  

Using RhinoMocks:

使用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();

#2


12  

Using Moq:

使用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);

#3


11  

Manually (because I hate Mocking frameworks that require 8 lines of setup per test)

手动(因为我讨厌每个测试需要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() }
};

#1


15  

Using RhinoMocks:

使用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();

#2


12  

Using Moq:

使用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);

#3


11  

Manually (because I hate Mocking frameworks that require 8 lines of setup per test)

手动(因为我讨厌每个测试需要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() }
};