Как выполнить модульное тестирование пользовательского вспомогательного метода UrlHelper - PullRequest
3 голосов
/ 10 марта 2011

Я использую ASP.NET MVC 3 и NUnit.Я пытаюсь написать модуль для тестирования одного из моих вспомогательных методов.Вот оно:

public static class UrlHelperAssetExtensions
{
   private static readonly string yuiBuildPath = "http://yui.yahooapis.com/2.8.2r1/build/";

   public static string YuiResetFontsGridsStylesheet(this UrlHelper helper)
   {
      return helper.Content(yuiBuildPath + "reset-fonts-grids/reset-fonts-grids.css");
   }
}

Вот мой модульный тест:

[Test]
public void YuiResetFontsGridsStylesheet_should_return_stylesheet()
{
   // Arrange
   RequestContext requestContext = new RequestContext();
   UrlHelper urlHelper = new UrlHelper(requestContext);

   // Act
   string actual = urlHelper.YuiResetFontsGridsStylesheet();

   // Assert
   string expected = yuiBuildPath + "reset-fonts-grids/reset-fonts-grids.css";
   Assert.AreEqual(expected, actual);
}

Правильно ли я тестирую его?Когда я запускаю его в графическом интерфейсе NUnit, я получаю следующую ошибку:

System.ArgumentNullException: значение не может быть нулевым.Имя параметра: httpContext

Возможно ли это проверить?Если да, объясните, пожалуйста, как я могу получить экземпляр httpContext?

ОБНОВЛЕНО

Я не могу пройти этот тест.В моем методе у меня есть следующее:

private static readonly string stylesheetPath = "~/Assets/Stylesheets/";

public static string Stylesheet(this UrlHelper helper)
{
   return helper.Content(stylesheetPath + "MyStylesheet.css");
}

Тест, который я написал для него, следующий:

private string stylesheetPath = "/Assets/Stylesheets/";
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 Stylesheet_should_return_stylesheet()
{
   // Act
   string actual = urlHelper.Stylesheet();

   // Assert
   string expected = stylesheetPath + "MyStylesheet.css";
   Assert.AreEqual(expected, actual);
}

GUI NUnit выдает следующую ошибку:

System.NullReferenceException : Object reference not set to an instance of an object.

Кажется, появляется ошибка с ~ in:

private static readonly string stylesheetPath = "~/Assets/Stylesheets/";

Ответы [ 2 ]

9 голосов
/ 10 марта 2011

Вам нужно издеваться над HttpContext. Вот пример использования Moq :

// Arrange
   var context = new Mock<HttpContextBase>();
   RequestContext requestContext = new RequestContext(context.Object, new RouteData());
   UrlHelper urlHelper = new UrlHelper(requestContext);

Если вы не хотите использовать фальшивый фреймворк, вы можете создать класс, который будет производным от HttpContextBase, и использовать его вместо этого. Но это потребует реализации множества абстрактных членов, которых вы можете избежать, высмеивая его.

2 голосов
/ 10 марта 2011

Лично мне нравится использовать MVCContrib TestHelper :

// arrange
// TODO: You could move this part in the SetUp part of your unit test
// to avoid repeating it in all tests
var cb = new TestControllerBuilder();
cb
    .HttpContext
    .Response
    .Stub(x => x.ApplyAppPathModifier(Arg<string>.Is.Anything))
    .WhenCalled(mi =>
    {
        mi.ReturnValue = mi.Arguments[0];
    })
    .Return(null);
var rc = new RequestContext(cb.HttpContext, new RouteData());
var helper = new UrlHelper(rc);

// act
var actual = helper.Stylesheet();

// assert
Assert.AreEqual("/Assets/Stylesheets/MyStylesheet.css", actual);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...