Forms 如何用Moq模拟MVC表单POST

Forms 如何用Moq模拟MVC表单POST,forms,model-view-controller,post,mocking,moq,Forms,Model View Controller,Post,Mocking,Moq,有人能告诉我如何使用Moq模拟MVC表单帖子吗 我只想基于几个不同的表单帖子对我的方法进行单元测试 我试着用谷歌搜索这个,但是没有一个从上到下的指南 谢谢 编辑:添加代码 [TestMethod] public void SubscriptionControllerTest() { var subscriptionViewModel = new SubscriptionViewModel(); //HTTP REQUEST SET UP

有人能告诉我如何使用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");

    }
}
[TestMethod]
public void SubscriptionControllerTest()
{
var subscriptionViewModel=新subscriptionViewModel();
//HTTP请求设置
var httpRequest=new Mock();
httpRequest.Setup(r=>r.Path)。返回(“/Subscription/sendmail”);
Setup(r=>r.Form).Returns(delegate()
{
var nv=新的NameValueCollection();
内华达州添加(“名字”、“约翰”);
内华达州添加(“姓氏”、“史密斯”);
nv.添加(“电子邮件”jsmith@host.com");
添加(“评论”,“评论在这里…”);
nv.添加(“接收更新”、“真实”);
返回nv;
});
//HTTP上下文设置
var httpContext=new Mock();
Setup(c=>c.Request).Returns(httpRequest.Object);
var subscriptionController=new Mock();
subscriptionController.Setup(s=>s.HttpContext).Returns(HttpContext.Object);
var result=subscriptionController.Object.sendmail(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", "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");

}
[TestMethod]
public void TestSendSubscriptionEmail()
{   
//HTTP上下文设置
var httpContext=new Mock();
var routeData=新routeData();
Setup(c=>c.Request.RequestContext.RouteData).Returns(RouteData);
Setup(c=>c.Request.Form).Returns(delegate()
{
var nv=新的NameValueCollection();
内华达州添加(“名字”、“约翰”);
内华达州添加(“姓氏”、“史密斯”);
nv.添加(“电子邮件”jsmith@host.com");
添加(“评论”,“评论在这里…”);
nv.添加(“接收更新”、“真实”);
返回nv;
});
httpContext.Setup(c=>c.Request.Path)。返回(“/Subscription/sendmail”);
var subscriptionViewModel=new Mock();
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=新的subscriptionController(subscriptionViewModel.Object);
var result=subscriptionController.sendmail(subscriptionViewModel.Object);
Assert.AreEqual(((ViewResult)result.ViewName,“Index”);
}
您可以发布您试图模拟的类(或其相关部分)吗?