2010-11-11 78 views
2

我试图使用MvcContrib TestHelper流利的路由测试API,但我看到奇怪的行为。 .WithMethod(HttpVerb)扩展方法似乎没有像预期的那样执行。这里的说明(2)操作(同名)接受不同HttpVerbs我的控制器:问题与MvcContrib TestHelper流畅的路由测试和特定的HttpVerbs

[HttpGet] 
public ActionResult IdentifyUser() 
{ 
    return View(new IdentifyUserViewModel()); 
} 

[HttpPost] 
public ActionResult IdentifyUser(IdentifyUserInputModel model) 
{ 
    return null; 
} 

这里是应该映射到与[HttpPost]属性的动作测试:

MvcApplication.RegisterRoutes(RouteTable.Routes); 

var routeData = "~/public/registration/useridentification/identifyuser" 
    .WithMethod(HttpVerbs.Post) 
    .ShouldMapTo<UserIdentificationController>(x => x.IdentifyUser(null)); 

即使尽管在我的测试中指定了POST HttpVerb,但它总是路由到HttpGet方法。 我甚至可以在我的控制器中注释接受HttpPost的动作并仍然通过测试!

有什么我在这里失踪?

回答

0

这可能与您如何注册路线有关。我通常创建一个只能做到这一点的类。因此,在进行上述任何测试之前,我确保适当地设置我的测试夹具。

[TestFixtureSetUp] 
public void TestFixtureSetUp() 
{ 
    RouteTable.Routes.Clear(); 
    new RouteConfigurator().RegisterRoutes(RouteTable.Routes); 
} 

我的猜测是,由于RouteTable静态处理它们,你可能会被要么不添加,不清除,或增加每测试运行太多的路线遇到了问题。

+0

感谢您的回应克里斯。这种情况与我的路线无关。我可以验证,通过更改我的POST动作的名称来说“IdentifyUserPost”,然后尝试通过浏览器中的GET请求来访问它。如预期的那样失败,但如果我将测试更改为“〜/ public/registration/useridentification/identifyuserpost”并将其更改为使用GET动词,我仍会看到合格的测试。看起来这更多是由于该行为没有执行,只是某种程度的路由验证。我正在研究MvcContrib的来源以了解更多信息... – 2010-11-12 13:13:11