Сбой теста вспомогательного метода URL при возврате строки - PullRequest
2 голосов
/ 10 сентября 2011

Я использую ASP.NET MVC 3 и NUnit.

Я создал вспомогательный метод для возврата метода действия как такового (перегруженный метод):

public static object CategoryIndex(this UrlHelper urlHelper)
{
   return new { controller = "Category", action = "Index" };
}

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

Неудачный тест - это второй тест под названием 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);
}

Жалуется, что фактическое значение равно нулю. С чего бы это и как мне это исправить?

Ответы [ 2 ]

4 голосов
/ 10 сентября 2011

мне кажется, что вы не инициализируете маршрутную коллекцию. Я думаю, что-то подобное сделает свое дело

[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);
}

Также кажется, что вы не настроили HttpContextBase. Убедитесь, что он правильно смоделирован, иначе вы получите исключение нулевой ссылки.

[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);
}
1 голос
/ 10 сентября 2011

Я предполагаю, что таблица маршрутов пуста, поэтому она не знает, как создать URL.

Добавьте нормальный маршрут / {controller} / {action}, и он должен работать.

(я разговариваю по телефону, так что прости, если это не так)

Вам нужно заблокировать реализацию IRouteHandler, которую я здесь назвал stub_handler.

RouteTable.Routes.Add(new Route
(
     "{controller}/{action}/{id}"
     , stub_handler
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...