Как макетировать форму MVC POST с помощью Moq - PullRequest
6 голосов
/ 14 декабря 2011

Может кто-нибудь сказать, как смоделировать сообщение формы MVC, используя Moq?

Все, что я хочу, - это модульное тестирование моего метода на основе нескольких постов в различных формах.

Я пытался это сделать в Google, и там нет руководства сверху вниз.

Спасибо

РЕДАКТИРОВАТЬ: добавление кода

    [TestMethod]
    public void SubscriptionControllerTest()
    {
        var subscriptionViewModel = new SubscriptionViewModel();

        //HTTP REQUEST SET UP
        var httpRequest = new Mock<HttpRequestBase>();

        httpRequest.Setup(r => r.Path).Returns("/Subscription/SendEmail");

        httpRequest.Setup(r => r.Form).Returns(delegate()
        {
            var nv = new NameValueCollection();
            nv.Add("FirstName", "John");
            nv.Add("LastName", "Smith");
            nv.Add("Email", "jsmith@host.com");
            nv.Add("Comments", "Comments are here...");
            nv.Add("ReceiveUpdates", "true");
            return nv;
        });


        //HTTP CONTEXT SET UP
        var httpContext = new Mock<HttpContextBase>();

        httpContext.Setup(c => c.Request).Returns(httpRequest.Object);

        var subscriptionController = new Mock<SubscriptionController>();
        subscriptionController.Setup(s => s.HttpContext).Returns(httpContext.Object);

        var result = subscriptionController.Object.SendEmail(subscriptionViewModel);

        Assert.AreEqual(((ViewResult)result).ViewName, "Index");

    }
}

У меня есть контроллер с именем SubscriptionController. Там у меня есть метод действия под названием SendEmail. Я хочу иметь возможность запустить мою подписку / SendEmail, используя этот метод теста выше. Мой вид - это форма со следующими полями: Имя, Фамилия, Электронная почта, Комментарии и флажок. Мне нужно смоделировать эту форму, а также смоделировать мой контроллер, http-запрос и контекст. Я немного запутался, что издеваться и что использовать в качестве реального. Спасибо за любые разъяснения.

1 Ответ

6 голосов
/ 15 декабря 2011

Ответ: вы можете смоделировать сообщение формы, установив значения формы непосредственно в форме Request.Form. Прежде, чем я издевался над HttpRequest, настраивал значения формы и затем связывал объект httpRequest с объектом HttpContext. Этот подход не сработал.

Я выкладываю решение ниже, просто сравните, что я делал раньше, и вы поймете.

[TestMethod]
public void TestSendSubscriptionEmail()
{   
    //HTTP CONTEXT SET UP
    var httpContext = new Mock<HttpContextBase>();           

    var routeData = new RouteData();
    httpContext.Setup(c => c.Request.RequestContext.RouteData).Returns(routeData);

    httpContext.Setup(c => c.Request.Form).Returns(delegate()
    {
        var nv = new NameValueCollection();
        nv.Add("FirstName", "John");
        nv.Add("LastName", "Smith");
        nv.Add("Email", "jsmith@host.com");
        nv.Add("Comments", "Comments are here...");
        nv.Add("ReceiveUpdates", "true");
        return nv;
    });

    httpContext.Setup(c => c.Request.Path).Returns("/Subscription/SendEmail");

    var subscriptionViewModel = new Mock<ISubscriptionViewModel>();

    subscriptionViewModel.Setup(h => h.HttpContext).Returns(httpContext.Object);

    subscriptionViewModel.Setup(h => h.FirstName).Returns(httpContext.Object.Request.Form["FirstName"]);
    subscriptionViewModel.Setup(h => h.LastName).Returns(httpContext.Object.Request.Form["LastName"]);
    subscriptionViewModel.Setup(h => h.Email).Returns(httpContext.Object.Request.Form["Email"]);
    subscriptionViewModel.Setup(h => h.Comments).Returns(httpContext.Object.Request.Form["Comments"]);
    subscriptionViewModel.Setup(h => h.InvestmentUpdates).Returns(bool.Parse(httpContext.Object.Request.Form["ReceiveUpdates"]));

    var subscriptionController = new SubscriptionController(subscriptionViewModel.Object);

    var result = subscriptionController.SendEmail(subscriptionViewModel.Object);

    Assert.AreEqual(((ViewResult)result).ViewName, "Index");

}
...