也许你已经解决了一些问题,但也可能有其他人在这个问题上没有得到任何帮助。所以我想我会试着给出一些关于这个问题的信息。
我不得不承认,我自己也曾与这个问题纠结过。
乔纳森·麦克拉肯(《试驾》一书的作者ASP.NETMVC”,我非常喜欢):
mvccontrib不映射参数,这取决于可以单独测试的模型绑定。所以在这些有参数的情况下,你需要传递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));
}
}
当然,您还需要将routedDefinitions添加到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
);
}
}
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/