Класс UrlHelper выбрасывает нулевое исключение в Asp.net MVC

Я занимаюсь разработкой веб-приложения Asp.net mvc. Я делаю юнит-тест для моего приложения. Я использую Moq, чтобы высмеивать объекты. Я пытаюсь издеваться над классом помощника Url. Я нашел эту ссылку - asp.net mvc: как издеваться над Url.Content("~")?, Используя этот класс, я могу издеваться UrlHelper класс в юнит-тесте.

Я создал BaseController как это

public class BaseController : Controller
{
    private IUrlHelper _urlHelper;

    public new IUrlHelper Url
    {
        get { return _urlHelper; }
        set { _urlHelper = value; }
    }
}

Здесь IUrlHelper Интерфейс / абстракция

public interface IUrlHelper
{
    string Action(string actionName);
    string Action(string actionName, object routeValues);
    string Action(string actionName, string controllerName);
    string Action(string actionName, RouteValueDictionary routeValues);
    string Action(string actionName, string controllerName, object routeValues);
    string Action(string actionName, string controllerName, RouteValueDictionary routeValues);
    string Action(string actionName, string controllerName, object routeValues, string protocol);
    string Action(string actionName, string controllerName, RouteValueDictionary routeValues, string protocol, string hostName);
    string Content(string contentPath);
    string Encode(string url);
    string RouteUrl(object routeValues);
    string RouteUrl(string routeName);
    string RouteUrl(RouteValueDictionary routeValues);
    string RouteUrl(string routeName, object routeValues);
    string RouteUrl(string routeName, RouteValueDictionary routeValues);
    string RouteUrl(string routeName, object routeValues, string protocol);
    string RouteUrl(string routeName, RouteValueDictionary routeValues, string protocol, string hostName);
}

Я издеваюсь Url.Content() в модульном тесте, как это

Mock<IUrlHelper> urlHelperMock = new Mock<IUrlHelper>();
urlHelperMock
    .Setup(x => x.Content(It.IsAny<string>()))
    .Returns<string>(x => "~/" + x);// Mock Content method of Url Helper

Тест успешно пройден и работает нормально. Проблема в том, что я не могу использовать его в режиме реального времени. Я имею в виду, когда я запускаю свое приложение и вызываю Url.Content ("путь"), оно выдает нулевое исключение.

Например

public class ExampleController : BaseController
{
    public string GetPath()
    {
       return Url.Content("~/Path/To/File");
    }
}

Url.Content в этом коде выбрасывает нулевое исключение. Он отлично работает в модульном тесте. Как я могу исправить этот код?

1 ответ

Решение

В этом случае действительно нет необходимости абстрагировать UrlHelper, Просто сделайте макет помощника для теста, чтобы сделать то, что требуется.

Например, предполагая

public class ExampleController : Controller {
    public string GetContent() {
       return Url.Content("~/Path/To/File");
    }
}

Вот тест, который издевается над UrlHelper используя moq для работы так же, как в оригинальном примере

[TestClass]
public class UrlHelperTest {
    [TestMethod]
    public void MockUrlHelper() {
        //Arrange            
        var expectedPath = "~/Path/To/File";
        var expectedContent = "<p>Fake content here<p>";
        var urlHelperMock = new Mock<UrlHelper>();
        urlHelperMock
            .Setup(m => m.Content(expectedPath))
            .Returns(expectedContent)
            .Verifiable();

        var sut = new ExampleController();
        sut.Url = urlHelperMock.Object; //Set mock UrlHelper        

        //Act
        var actualContent = sut.GetContent();

        //Assert
        urlHelperMock.Verify();
        Assert.AreEqual(expectedContent, actualContent);
    }
}

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

Другие вопросы по тегам