如何使用Moq模拟MVC表单POST请求

7

请问如何使用Moq模拟MVC表单提交?我想针对几个不同的表单提交进行单元测试。

我在谷歌上搜索了一下,但没有找到完整的指南。

谢谢。

编辑:添加代码

    [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的Action方法。我希望能够使用上面的Test方法来运行我的Subscription / SendEmail。 我的视图是一个表单,包含以下字段:名字,姓氏,电子邮件,评论和复选框。 我需要模拟这个表单以及模拟我的控制器、http请求和上下文。我有点困惑要模拟什么以及要使用什么作为真实的东西。谢谢任何澄清。


你能否发布你试图模拟的类(或相关部分)? - Erik Dietrich
1个回答

7
答案:您可以通过直接在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");

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接