forms - 如何使用 Moq 模拟 MVC 表单 POST

标签 forms model-view-controller post mocking moq

谁能告诉我如何使用 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 的 Controller 。
在那里,我有一个名为 SendEmail 的操作方法。
我希望能够使用上面的测试方法运行我的订阅/发送电子邮件。
我的 View 是一个包含以下字段的表单:名字、姓氏、电子邮件、评论和一个复选框。
我需要模拟这个表单并模拟我的 Controller 、http 请求和上下文。我有点困惑什么要模拟,什么是真实的。感谢您的澄清。

最佳答案

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

}

关于forms - 如何使用 Moq 模拟 MVC 表单 POST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8506039/

相关文章:

model-view-controller - WordPress MVC 兼容吗?

c# - 通过 Url.Action 将参数发送到 asp.net MVC 中的 Controller

php - 为什么在PHP中发送POST请求时fsockopen有性能问题而不是fopen?

C# 等效于 PHP http_build_query

c# - 将包含复杂类型数组的复杂类型传递给 Web API

javascript - 在其他下拉菜单中选择后禁用下拉选项

php - MVC 中的路由、导航和状态

ruby - 需要帮助使用 Ruby net/http 将 xml 属性列表作为 HTTP 正文发送

forms - CForm Yii 框架上的自定义表单元素名称属性

javascript - 带有两个提交按钮执行两项不同操作的表单