【问题标题】:How to mock MVC form POST with Moq如何使用 Moq 模拟 MVC 表单 POST
【发布时间】:2011-12-14 14:25:08
【问题描述】:

谁能告诉我如何使用 Moq 模拟 MVC 表单帖子?

我只想根据几个不同的表单帖子对我的方法进行单元测试。

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

【问题讨论】:

  • 您可以发布您要模拟的课程(或课程的相关部分)吗?

标签: forms model-view-controller post mocking moq


【解决方案1】:

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

}

【讨论】:

    猜你喜欢
    • 2011-02-15
    • 1970-01-01
    • 2010-11-29
    • 2018-01-13
    • 2012-03-18
    • 2010-10-19
    • 2016-09-30
    • 2019-10-06
    • 1970-01-01
    相关资源
    最近更新 更多