mvccontrib测试助手并验证http post路由和参数

时间:2010-01-29 02:52:06

标签: asp.net asp.net-mvc url-routing mvccontrib

在我的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))等等。即使我必须明确提供值,这是可行的 - 我似乎无法理解所需的结构来传递这些显式值。

2 个答案:

答案 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)方法永远不会作为路由测试的一部分执行。