我在使用MvcContrib的ShouldMapTo函数进行路由测试时遇到了预期的错误。根据结果,一切都很好,但帮助器抛出一个AssertionException与一个不幸的稀疏消息。我正在使用MVC1和相应的MvcContirb。
[Test]
public void ThisShouldNotErrorButItDoes()
{
"~/District/ParticipantInfo/1907/2010".Route().Values.ToList().ForEach(r => Console.WriteLine(r.Key + ": " + r.Value));
Console.WriteLine(((Route)"~/District/ParticipantInfo/1907/2010".Route().Route).Url);
"~/District/ParticipantInfo/1907/2010".ShouldMapTo<DistrictController>(c => c.ParticipantInfo(1907, 2010));
}
前两行显示不应抛出异常。我正在映射正确的控制器,action,districtNumber和surveyYear以匹配{controller} / {action} / {districtNumber} / {surveyYear}的正确路由。
我的路线:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Participation",
"{controller}/{action}/{districtNumber}/{surveyYear}",
new { controller = "District", action = "ParticipantInfo" });
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = string.Empty }); // Parameter defaults
}
我得到的错误是MvcContrib.TestHelper.AssertionException:参数的值不匹配。
我已将此跟踪到:public static RouteData ShouldMapTo(此RouteData routeData,Expression&gt; action)
其中TController:控制器
这是在RouteTestingExtensions.cs
有人对此有任何线索吗?
答案 0 :(得分:3)
可能你已经解决了一些事情,但可能还有其他一些人正在登陆这个问题而没有得到任何帮助。所以我想我会试着提供一些关于这个问题的信息。
我不得不承认我自己也纠结过这个问题。 请让我参考另一个论坛以获得一些见解。
Jonathan McCracken(“Test-Drive ASP.NET MVC”的作者,我非常喜欢):
MVC Contrib不会映射参数,这取决于可以单独测试的模型绑定。因此,在这些情况下,您需要传递null参数,然后测试将通过。
以下是解决方案:
[TestFixture]
public class RouteDefinitionsTest
{
[SetUp]
public void setup()
{
var routes = RouteTable.Routes;
routes.Clear();
RouteDefinitions.AddRoutes(routes);
}
[Test]
public void Should_Route_To_Edit_Page_With_Title()
{
"~/Todo/Edit".
ShouldMapTo<TodoController>(x => x.Edit(null));
}
}
当然,您还需要将RouteDefinitions添加到您的Web项目中:
public class RouteDefinitions
{
public static void AddRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute("Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new {controller = "Home", action = "Index", id = string.Empty} // Parameter defaults
);
}
}
我刚从Global.asax.cs文件中提取了这个,所以现在需要更改为以下内容:
public static void RegisterRoutes(RouteCollection routes)
{
RouteDefinitions.AddRoutes(routes);
}
来源(2010年7月21日):http://forums.pragprog.com/forums/124/topics/4824
如果您关心“ShouldMapTo()”的内部工作原理,那么这里就是源代码。把自己弄出来。
public static RouteData ShouldMapTo<TController>(this RouteData routeData, Expression<Func<TController, ActionResult>> action)
where TController : Controller
{
Assert.That(routeData, Is.Not.Null, "The URL did not match any route");
//check controller
routeData.ShouldMapTo<TController>();
//check action
var methodCall = (MethodCallExpression) action.Body;
string actualAction = routeData.Values.GetValue("action").ToString();
string expectedAction = methodCall.Method.Name;
actualAction.AssertSameStringAs(expectedAction);
//check parameters
for (int i = 0; i < methodCall.Arguments.Count; i++)
{
string name = methodCall.Method.GetParameters()[i].Name;
object value = ((ConstantExpression) methodCall.Arguments[i]).Value;
Assert.That(routeData.Values.GetValue(name), Is.EqualTo(value.ToString()));
}
return routeData;
}
来源(2008年11月25日):http://flux88.com/blog/fluent-route-testing-in-asp-net-mvc/(可能有些过时了)