Попытка проверить контроллер с помощью UrlHelper - PullRequest
0 голосов
/ 15 января 2019

Попытка создать URLHelper для целей тестирования выдает NullReferenceException.

Пример:

[Fact]
public async void AuthenticateAsyncTest()
{
  // Arrange
  var controller = new Controller(serviceProvider)
  {
    Url = new UrlHelper(new ActionContext()) // Exception thrown
  };

  // Act
  var result = await controller.Authenticate() as ViewResult;

  // Assert
  Assert.NotNull(result);
}

Каждый раз, когда я запускаю этот тест, исключение, которое выдается в Url = new UrlHelper(new ActionContext()):

Exception.Message:

Сообщение: System.NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта.

Exception.StackTrace:

UrlHelperBase.ctor (ActionContext actionContext) ControllerUnitTest.AuthenticateAsyncTest ()

Использование:

xUnit 2.4.1, Microsoft.NETCore.App 2.2.0, Microsoft.AspNetCore.Routing.Abstractions 2.2.0

Для воссоздания исключения:

  1. Создание пустого решения MVC core 2.2
  2. Создание тестового проекта xunit
  3. Установить NuGet Microsoft.AspNetCore.Mvc.Core 2.2.0
  4. Запись в тесте: var Url = new UrlHelper (new ActionContext ());
  5. Выполнить тест

Должно выглядеть так:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Routing;
using Xunit;

namespace XUnitTestProject1
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            var Url = new UrlHelper(new ActionContext());
        }
    }
}

Мои вопросы:

  1. Есть ли ошибка или почему она не работает?
  2. Литература к обходному пути или ссылки приветствуются?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Второй вариант - использовать определенный конструктор. В документе говорится, что его следует использовать для модульного тестирования, более конкретно, когда просто необходимо передать ActionContext, но не использовать его потребляющий код.

UrlHelper Url = new UrlHelper(new ActionContext { RouteData = new RouteData() });

Спасибо navelDirt и pranavkm, которые переиграли на githhub: https://github.com/aspnet/AspNetCore/issues/6703

0 голосов
/ 15 января 2019

Согласно исходному коду GitHub , указанному в сообщении об исключении,

protected UrlHelperBase(ActionContext actionContext)
{
    if (actionContext == null)
    {
        throw new ArgumentNullException(nameof(actionContext));
    }

    ActionContext = actionContext;
    AmbientValues = actionContext.RouteData.Values;
    _routeValueDictionary = new RouteValueDictionary();
}

Помощник пытается получить доступ к actionContext.RouteData.Values, который не был предоставлен в исходном примере.

Укажите необходимые зависимости для завершения теста.

[Fact]
public async Task AuthenticateAsyncTest() {
    // Arrange
    var httpContext = new DefaultHttpContext();
    var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
    var controller = new Controller(serviceProvider) {
        Url = new UrlHelper(actionContext)
    };

    // Act
    var result = await controller.Authenticate() as ViewResult;

    // Assert
    Assert.NotNull(result);
}

Также избегайте использования async void для модульных тестов.Вместо этого используйте Task.

...