2010-01-29 47 views
6

在我的Asp.net MVC应用程序中,我有两个方法在控制器上,一个用于当用户第一次到达视图时,然后一个当他们在所述视图上提交表单。mvccontrib测试助手和验证http发布路线和参数

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")); 

我的问题是在测试邮路,我怎么写,我会使用验证后正在接受正确的值,类似于上面的GET测试拉姆达?

一个职位,它看起来是这样的:

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

这是我的拉姆达是我遇到的麻烦的something_something部分。使用任意值不起作用(“a => a.Foo(0,new Account()”)。我如何指定期望值作为测试的一部分?

编辑我希望有人类似于Moq对foo.Setup(s => s.Foo(It.IsAny(),It.Is(i => i> 32))等语句使用lambda表达式的方式,即使我必须明确。提供的值,这是可行的 - 我似乎无法神交所需的结构来传递这些明确的价值观

+0

你有没有解决过这个问题? – Paul 2010-02-01 13:27:00

+0

没有,从来没有 - 和我的新应用程序的其他部分分心,单元测试这些特定的POST行动落在了一边。仍然很想知道如何最好地解决这个问题。 – bakasan 2010-02-02 09:40:19

回答

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说法。

+0

奇怪的是,这种情况对我不起作用。我在同一个控制器上有两个动作,一个标记为HttpGet,一个标记为HttpPost。我可以注释掉HttpPost方法(与HttpGet同名,但具有不同的签名),并且我的测试仍将使用您在上面的“您可以测试它”的注释中提供的示例。这里是我的问题的链接,如果你有任何想法:http:// stackoverflow。COM /问题/ 4157161 /问题与 - mvccontrib-testhelper流利的路由测试功能和特定httpverbs – 2010-11-11 20:59:54

2

使用mvccontrib帮手语法:

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

您传递null作为美孚(字符串身份证,户口accountToFoo)方法永远不会作为路由测试的一部分执行。