在我的Asp.net MVC应用程序中,我在控制器上有两个方法,一个用于用户第一次到达视图时,另一个用于在所述视图上提交表单时。
public ActionResult Foo() {}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Foo(string id, Account accountToFoo) {}
在第二个动作中,有一个自定义模型绑定器正在组装我正在执行的帐户对象,尽管这并不重要。这一切都可以在服务器上进行本地测试。
我们尝试编写单元测试以测试所有不同的视图是否正确路由到包括HTTP POST的那些视图。为此,我们一直在使用mvccontrib的测试助手。
测试变得非常简单
"~/account/foo/myusername".
Route().
ShouldMapTo<AccountController>(c => c.Foo("myusername"));
我的问题是在测试POST路由时,如何编写用于验证帖子是否正在接收准确值的lambda,类似于上面的GET测试?
对于POST,它看起来像:
"~/account/foo".
WithMethod(HttpVerbs.Post).
ShouldMapTo<AccountController>(a => something_something);
这是我的lambda中的某些东西,我遇到了麻烦。使用任意值不起作用(“a =&gt; a.Foo(0,new Account()”)。如何将预期值指定为测试的一部分?
编辑我希望有一些类似于Moq对foo等语句的lambdas的方式.Setup(s =&gt; s.Foo(It.IsAny(),It.Is( i =&gt; i&gt; 32))等等。即使我必须明确提供值,这是可行的 - 我似乎无法理解所需的结构来传递这些显式值。
答案 0 :(得分:15)
这是一个例子。假设您有以下操作:
public AccountController : Controller
{
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Foo(string id)
{
return View();
}
}
注册以下路线:
RouteTable.Routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "home", action = "index", id = "" }
);
您可以像这样测试:
var routeData = "~/account/foo".WithMethod(HttpVerbs.Post);
routeData.Values["id"] = "123";
routeData.ShouldMapTo<AccountController>(c => c.Foo("123"));
可能需要进行一些调整以包含您拥有的第二个Account
参数。
答案 1 :(得分:2)
使用mvccontrib帮助器语法:
"~/account/foo".WithMethod(HttpVerbs.Post).ShouldMapTo<AccountController>(a => a.foo(null));
您传递null,因为Foo(字符串ID,帐户accountToFoo)方法永远不会作为路由测试的一部分执行。