Имитация контекста контроллера Asp.net-mvc

Вот образец класса модульного asp.net-mvc теста с использованием MsTest mocks и Moq, который имитирует asp-mvc объекты HttpRequest и HttpResponse. (.NET asp.mvc 4.0, ASP.NET MVC 3.0)

Действие moq контроллера получает значение mvc.net из запроса и устанавливает unit-test заголовок http в объектах asp.net-mvc ответа. Аналогичным образом asp-net-mvc можно смоделировать другие asp.net-mvc объекты контекста http

[TestClass]
public class MyControllerTest
{
    protected Mock HttpContextBaseMock;
    protected Mock HttpRequestMock;
    protected Mock HttpResponseMock;

    [TestInitialize]
    public void TestInitialize()
    {
        HttpContextBaseMock = new Mock();
        HttpRequestMock = new Mock();
        HttpResponseMock = new Mock();
        HttpContextBaseMock.SetupGet(x => x.Request).Returns(HttpRequestMock.Object);
        HttpContextBaseMock.SetupGet(x => x.Response).Returns(HttpResponseMock.Object);
    }

    protected MyController SetupController()
    {
        var routes = new RouteCollection();
        var controller = new MyController();
        controller.ControllerContext = new ControllerContext(HttpContextBaseMock.Object, new RouteData(), controller);
        controller.Url = new UrlHelper(new RequestContext(HttpContextBaseMock.Object, new RouteData()), routes);
        return controller;
    }

    [TestMethod]
    public void IndexTest()
    {
        HttpRequestMock.Setup(x => x["x"]).Returns("1");
        HttpResponseMock.Setup(x => x.AddHeader("name", "value"));

        var controller = SetupController();
        var result = controller.Index();
        Assert.AreEqual("1", result.Content);

        HttpRequestMock.VerifyAll();
        HttpResponseMock.VerifyAll();
    }
}

public class MyController : Controller
{
    public ContentResult Index()
    {
        var x = Request["x"];
        Response.AddHeader("name", "value");
        return Content(x);
    }
}

asp.net-mvc

unit-testing

mocking

moq

rhino-mocks

2022-04-16T14:50:53+00:00