Visual studio 2010 什么';这是编写单元测试并向控制器发送请求表单数据的最简单方法吗?

Visual studio 2010 什么';这是编写单元测试并向控制器发送请求表单数据的最简单方法吗?,visual-studio-2010,unit-testing,asp.net-mvc-2,Visual Studio 2010,Unit Testing,Asp.net Mvc 2,基本上,我想设置20个左右的Request.Form值,向我的控制器发送帖子,然后检查结果 我发现了几篇文章,比如它描述了如何结合NUnit、MVCContrib和Rhino Mock来实现这一点。但我不知道这是否真的有必要 看起来Visual Studio 2010和ASP.NET MVC 2应该能够以本机方式执行此操作,并在“测试结果”小窗口中显示结果。事实上,当我用向导创建一个新的单元测试时,它会出现以下结果 [TestMethod()] [HostType("ASP.NET")] [As

基本上,我想设置20个左右的Request.Form值,向我的控制器发送帖子,然后检查结果

我发现了几篇文章,比如它描述了如何结合NUnit、MVCContrib和Rhino Mock来实现这一点。但我不知道这是否真的有必要

看起来Visual Studio 2010和ASP.NET MVC 2应该能够以本机方式执行此操作,并在“测试结果”小窗口中显示结果。事实上,当我用向导创建一个新的单元测试时,它会出现以下结果

[TestMethod()]
[HostType("ASP.NET")]
[AspNetDevelopmentServerHost("G:\\Webs\\MyWebsite.com\\MyWebsite", "/")]
[UrlToTest("http://localhost:43383/")]
public void PaypalIPNTest()
{
    BuyController target = new BuyController(); // TODO: Initialize to an appropriate value
    ActionResult expected = new EmptyResult(); // TODO: Initialize to an appropriate value
    ActionResult actual;
    actual = target.PaypalIPN();
    Assert.AreEqual(expected, actual);
    Assert.Inconclusive("Verify the correctness of this test method.");
}
是否可以基于上述代码向target.PaypalIPN()馈送
my Request.Form变量?或者我需要依靠第三方库来完成这项工作吗

事实上,当我用向导创建一个新的单元测试时,它会这样做

是的,您可以从中保留的只是方法签名。方法体是无用的

让我们从这个开始:

是否可以为target.PaypalIPN()我的Request.Form变量提供数据

通过阅读这句话,我假设您的控制器动作如下所示:

[HttpPost]
public ActionResult PaypalIPN()
{
    string foo = Request["foo"];
    string bar = Request["bar"];
    ... do something with foo and bar
}
因此,首先是通过引入视图模型来改进此代码:

public class MyViewModel
{
    public string Foo { get; set; }
    public string Bar { get; set; }
}
然后将方法签名修改为:

[HttpPost]
public ActionResult PaypalIPN(MyViewModel model)
{
    ... do something with model.Foo and model.Bar
}
现在,您的控制器是从任何HttpContext基础结构代码中抽象出来的(这实际上应该留给框架,读取请求参数=>这是管道代码并不是您的控制器操作的责任),单元测试其实很简单:

[TestMethod()]
public void PaypalIPNTest()
{
    // arrange
    var sut = new BuyController();
    var model = new MyViewModel
    {
        Foo = "some foo",
        Bar = "some bar",
    };

    // act
    var actual = sut.PaypalIPN(model);

    // assert
    // TODO:
}

好的,话虽如此,这里我们讨论一些非常简单的控制器动作。对于更高级的场景,您确实应该考虑使用嘲讽框架。就我个人而言,我使用Rhino Mock对我的ASP.NET MVC应用程序进行单元测试。

我有另一种方法来测试我的MVC应用程序,首先,我使用Dev-Magic-Fake伪造控制器下的任何下划线层,直到应用程序运行且业务得到批准,然后根据批准的需求,用TDD方法替换伪造代码

请参阅CodePlex上的Dev Magic Fake:

谢谢


拉德万先生

谢谢你,伙计。我忘记了MVC引擎可以将模型自动解释为表单集合。这样做肯定会稍微清理PaypalIPN函数。