Asp.net mvc 2 MvcContrib TestHelper Fluent路由测试和特定HttpVerbs存在问题

Asp.net mvc 2 MvcContrib TestHelper Fluent路由测试和特定HttpVerbs存在问题,asp.net-mvc-2,nunit,mvccontrib-testhelper,Asp.net Mvc 2,Nunit,Mvccontrib Testhelper,我试图使用MvcContrib TestHelper fluent路由测试API,但我看到了一些奇怪的行为。.WithMethod(HttpVerb)扩展方法似乎没有按预期执行。下面是我的控制器,它显示了(2)个接受不同HttpVerbs的操作(名称相同): [HttpGet] public ActionResult IdentifyUser() { return View(new IdentifyUserViewModel()); } [HttpPost] public Action

我试图使用MvcContrib TestHelper fluent路由测试API,但我看到了一些奇怪的行为。.WithMethod(HttpVerb)扩展方法似乎没有按预期执行。下面是我的控制器,它显示了(2)个接受不同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));
mvcapapplication.registerOutes(RouteTable.Routes);
var routeData=“~/public/registration/useridentification/identificationuser”
.WithMethod(HttpVerbs.Post)
.ShouldMapTo(x=>x.IdentifyUser(null));
即使在我的测试中指定了PostHttpVerb,它也总是路由到HttpGet方法。我甚至可以在我的控制器中注释掉接受HttpPost的操作,仍然可以通过测试


这里有什么我遗漏的吗?

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

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

我的猜测是,由于RouteTable以静态方式处理它们,您可能会遇到问题,可能是每次测试运行时没有添加、没有清除或添加太多路由。

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

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

我的猜测是,由于RouteTable以静态方式处理它们,您可能会遇到问题,可能是没有添加、没有清除,或者在每次测试运行中添加太多路由。

谢谢您的回复。在这种情况下,它与我的路线无关。我可以通过将我的POST操作的名称更改为“IdentifyUserPost”,然后尝试通过浏览器中的GET请求访问它来验证这一点。这正如预期的那样失败了,但是如果我将我的测试改为现在路由到“~/public/registration/useridentification/identificationuserpost”,并将其改为使用GET动词,我仍然可以看到一个通过的测试。这似乎更多的是由于操作没有执行,只是某种程度的路由验证。我正在查看MvcContrib的来源以了解更多信息…感谢Chris的回复。在这种情况下,它与我的路线无关。我可以通过将我的POST操作的名称更改为“IdentifyUserPost”,然后尝试通过浏览器中的GET请求访问它来验证这一点。这正如预期的那样失败了,但是如果我将我的测试改为现在路由到“~/public/registration/useridentification/identificationuserpost”,并将其改为使用GET动词,我仍然可以看到一个通过的测试。这似乎更多的是由于操作没有执行,只是某种程度的路由验证。我正在研究MvcContrib的源代码以了解更多。。。