开发者

URL helper method test failing when returning string

开发者 https://www.devze.com 2023-04-03 18:26 出处:网络
I am using ASP.NET MVC 3 and NUnit. I created a helper method to to return an action method as such (overloaded method):

I am using ASP.NET MVC 3 and NUnit.

I created a helper method to to return an action method as such (overloaded method):

public static object CategoryIndex(this UrlHelper urlHelper)
{
   return new { controller = "Category", action = "Ind开发者_运维技巧ex" };
}

public static string CategoryIndex(this UrlHelper helper, int categoryId)
{
   return helper.RouteUrl(new { controller = "Category", action = "Index", id = categoryId });
}

The test that is failing is the second test called CategoryIndex_should_navigate_to_category_index_action_method_with_child_category_id().

private HttpContextBase httpContextBaseStub;
private RequestContext requestContext;
private UrlHelper urlHelper;

[SetUp]
public void SetUp()
{
   httpContextBaseStub = MockRepository.GenerateStub<HttpContextBase>();
   requestContext = new RequestContext(httpContextBaseStub, new RouteData());
   urlHelper = new UrlHelper(requestContext);
}

[Test]
public void CategoryIndex_should_navigate_to_category_index_action_method()
{
   // Act
   object actual = UrlHelperNavigationExtensions.CategoryIndex(urlHelper);

   // Assert
   RouteValueDictionary routes = new RouteValueDictionary(actual);

   Assert.AreEqual("Category", routes["controller"]);
   Assert.AreEqual("Index", routes["action"]);
}

[Test]
public void CategoryIndex_should_navigate_to_category_index_action_method_with_child_category_id()
{
   // Arrange
   int childCategoryId = 1;

   // Act
   string actual = UrlHelperNavigationExtensions.CategoryIndex(urlHelper, childCategoryId);

   // Assert
   Assert.AreEqual("/Category/Index/1", actual);
}

It's complaining that actual is null. Why would this be and how would I rectify it?


it seems to me that you don't initialize the routecollection. I guess something like that would do the trick

[SetUp]
public void SetUp()
{
   RouteCollection routes = new RouteCollection();
   MvcApplication.RegisterRoutes(routes);

   httpContextBaseStub = MockRepository.GenerateStub<HttpContextBase>();
   requestContext = new RequestContext(httpContextBaseStub, new RouteData());

   //urlHelper = new UrlHelper(requestContext);
   urlHelper = new UrlHelper(requestContext, routes);
}

It seems also, that you don't setup the HttpContextBase. Be sure to have it properly mocked or you will get some null reference exception.

[SetUp]
public void SetUp()
{
  RouteCollection routes = new RouteCollection();
  MvcApplication.RegisterRoutes(routes);

  //httpContextBaseStub = (new Moq.Mock<HttpContextBase>()).Object;

  var request = new Mock<HttpRequestBase>();
  var response = new Mock<HttpResponseBase>();
  response.Setup(r => r.ApplyAppPathModifier(It.IsAny<string>())).Returns((String url) => url);
  var mockHttpContext = new Mock<HttpContextBase>();
  mockHttpContext.Setup(c => c.Request).Returns(request.Object);
  mockHttpContext.Setup(c => c.Response).Returns(response.Object);
  requestContext = new RequestContext(mockHttpContext.Object, new RouteData());

  urlHelper = new UrlHelper(requestContext, routes);
}


My guess is because the route table is empty, so it doesn't know how to generate the url.

Add the normal /{controller}/{action} route and it should work.

(i'm on a phone so forgive if this is wrong)

You need to stub an IRouteHandler implementation, which I've called stub_handler here.

RouteTable.Routes.Add(new Route
(
     "{controller}/{action}/{id}"
     , stub_handler
);
0

精彩评论

暂无评论...
验证码 换一张
取 消