如何使用Moq模拟MVC表单POST
问题描述:
任何人都可以请告诉如何使用Moq模拟MVC表单发布?如何使用Moq模拟MVC表单POST
我要的只是单元测试我的方法基于几个不同的表单帖子。
我试过谷歌这一点,并没有从上到下的指导。
感谢
编辑:添加代码
[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", "[email protected]");
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请求和上下文。我有点困惑,嘲笑什么和真正使用什么。谢谢你的澄清。
答
答:您可以通过直接在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", "[email protected]");
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-12-14 17:42:43