基本上我想设置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变量?或者我是否需要依靠第三方库来完成这项工作?
答案 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