gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:03:03 25 4
gpt4 key购买 nike

谁能告诉我如何使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com