Asp.net mvccontrib测试助手和验证http post路由和参数

Asp.net mvccontrib测试助手和验证http post路由和参数,asp.net,asp.net-mvc,url-routing,mvccontrib,Asp.net,Asp.net Mvc,Url Routing,Mvccontrib,在我的Asp.net MVC应用程序中,我在一个控制器上有两个方法,一个用于用户第一次到达视图时,另一个用于用户在所述视图上提交表单时 public ActionResult Foo() {} [AcceptVerbs(HttpVerbs.Post)] public ActionResult Foo(string id, Account accountToFoo) {} 在第二个动作中,有一个自定义模型绑定器,它正在组装我正在处理的account对象,尽管这并不重要。在服务器上进行本地测试时

在我的Asp.net MVC应用程序中,我在一个控制器上有两个方法,一个用于用户第一次到达视图时,另一个用于用户在所述视图上提交表单时

public ActionResult Foo() {}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Foo(string id, Account accountToFoo) {}
在第二个动作中,有一个自定义模型绑定器,它正在组装我正在处理的account对象,尽管这并不重要。在服务器上进行本地测试时,这一切都很好

我们试图非常好地编写单元测试来测试所有不同的视图是否正确地被路由到,包括HTTP POST。为此,我们一直在使用mvccontrib的测试助手

测试非常简单

"~/account/foo/myusername".
       Route().
       ShouldMapTo<AccountController>(c => c.Foo("myusername"));
“~/account/foo/myusername”。
路由()。
ShouldMapTo(c=>c.Foo(“我的用户名”);
我的问题是在测试POST路由时,如何编写lambda来验证POST是否接收到准确的值,类似于上面的GET测试

对于帖子,它看起来像:

"~/account/foo".
         WithMethod(HttpVerbs.Post).
         ShouldMapTo<AccountController>(a => something_something);
“~/account/foo”。
WithMethod(HttpVerbs.Post)。
ShouldMapTo(a=>something\u something);
这是我的lambda中我遇到麻烦的部分。使用任意值都不起作用(“a=>a.Foo(0,new Account()”)。如何将预期值指定为测试的一部分


EDIT我希望有类似于Moq对foo.Setup(s=>s.foo(It.IsAny(),It.Is(I=>I>32))等语句使用lambdas的方式依此类推。即使我必须显式地提供值,这也是可行的——我似乎无法找到所需的结构来传递这些显式值。

下面是一个示例。假设您有以下操作:

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"));
var routeData=“~/account/foo”.WithMethod(HttpVerbs.Post);
路由数据值[“id”]=“123”;
routeData.ShouldMapTo(c=>c.Foo(“123”);

可能需要进行一些调整,以包含您拥有的第二个
帐户
参数。

使用mvccontrib帮助程序语法:

"~/account/foo".WithMethod(HttpVerbs.Post).ShouldMapTo<AccountController>(a => a.foo(null));
“~/account/foo”.WithMethod(HttpVerbs.Post).ShouldMapTo(a=>a.foo(null));

传递null作为Foo(字符串id,accountToFoo)方法从未作为路由测试的一部分执行。

你解决过这个问题吗?没有,从未解决过——而且我的新应用程序的其他部分让我分心,单元测试这些特定的POST操作被搁置了。我仍然想知道如何最好地处理这个问题。奇怪的是,这个场景对我不起作用。我有两个操作在同一个控制器上,一个标记为HttpGet,一个标记为HttpPost。我可以注释掉HttpPost方法(与HttpGet同名,但签名不同),使用您在上面的“您可以像这样测试它”注释中提供的示例,我的测试仍然会通过。如果您有任何想法,这里是指向我的问题的链接: