编写将Request.Form数据发送到控制器的单元测试最简单的方法是什么?

时间:2011-09-06 21:40:51

标签: visual-studio-2010 unit-testing asp.net-mvc-2

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

我找到了一些文章,例如this one,它描述了如何使用NUnit,MVCContrib和Rhino Mocks的组合来完成这项工作。但我不知道这是否真的有必要。

似乎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()我的Request.Form变量?或者我是否需要依靠第三方库来完成这项工作?

2 个答案:

答案 0 :(得分:3)

  

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

是的,您可以保留的是方法签名。方法体是没用的。

让我们先来看看这个:

  

是否可以提供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:
}

好的,这就是说,我们在这里处理了一些非常简单的控制器动作。对于更高级的场景,您应该考虑使用模拟框架。我个人使用MvcContrib.TestHelper与Rhino Mocks一起测试我的ASP.NET MVC应用程序。

答案 1 :(得分:0)

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

在CodePlex上看到Dev Magic Fake:

http://devmagicfake.codeplex.com/

由于

M.Radwan