我正在尝试为这样使用的 UrlHelper 扩展方法编写测试:
Url.Action<TestController>(x => x.TestAction());
但是,我似乎无法正确设置它,以便我可以创建一个新的 UrlHelper 然后断言返回的 url 是预期的。这就是我所拥有的,但我也对任何不涉及嘲笑的事情持开放态度。;O)
[Test]
public void Should_return_Test_slash_TestAction()
{
// Arrange
RouteTable.Routes.Add("TestRoute", new Route("{controller}/{action}", new MvcRouteHandler()));
var mocks = new MockRepository();
var context = mocks.FakeHttpContext(); // the extension from hanselman
var helper = new UrlHelper(new RequestContext(context, new RouteData()), RouteTable.Routes);
// Act
var result = helper.Action<TestController>(x => x.TestAction());
// Assert
Assert.That(result, Is.EqualTo("Test/TestAction"));
}
我尝试将其更改为 urlHelper.Action("Test", "TestAction") 但无论如何它都会失败,所以我知道这不是我的扩展方法不起作用。NUnit 返回:
NUnit.Framework.AssertionException: Expected string length 15 but was 0. Strings differ at index 0.
Expected: "Test/TestAction"
But was: <string.Empty>
我已经验证该路由已注册并且可以正常工作,并且我正在使用 Hanselmans 扩展来创建一个假的 HttpContext。这是我的 UrlHelper 扩展方法的样子:
public static string Action<TController>(this UrlHelper urlHelper, Expression<Func<TController, object>> actionExpression) where TController : Controller
{
var controllerName = typeof(TController).GetControllerName();
var actionName = actionExpression.GetActionName();
return urlHelper.Action(actionName, controllerName);
}
public static string GetControllerName(this Type controllerType)
{
return controllerType.Name.Replace("Controller", string.Empty);
}
public static string GetActionName(this LambdaExpression actionExpression)
{
return ((MethodCallExpression)actionExpression.Body).Method.Name;
}
关于我缺少什么让它工作的任何想法???/克里斯托弗