#c# #unit-testing #asp.net-core
#c# #модульное тестирование #asp.net-ядро
Вопрос:
В настоящее время я пишу модульные тесты для a TagHelper
, которые используются IActionDescriptorCollectionProvider
в его конструкторе. Моя настройка пока выглядит так, как показано ниже — есть идеи о том, как настроить что-то, чтобы удовлетворить IActionDescriptorCollectionProvider
и позволить мне изменить значение IActionDescriptorCollectionProvider.ActionDescriptors.Items
для моего тестирования?
Я не могу использовать DefaultActionDescriptorCollectionProvider
реализацию, поскольку она недоступна. Есть ли простой способ сделать это, или я должен просто заменить его на NSubstitute ?
[SetUp]
public void Setup()
{
IHttpContextAccessor contextAccessor = new HttpContextAccessor();
contextAccessor.HttpContext = new DefaultHttpContext();
contextAccessor.HttpContext.Request.Path = "/foo";
IActionDescriptorCollectionProvider actionDescriptorCollectionProvider;
actionDescriptorCollectionProvider = new DefaultActionDescriptorCollectionProvider();
ActivePathSegmentTagHelper helper;
helper = new ActivePathSegmentTagHelper(contextAccessor, actionDescriptorCollectionProvider);
helper.Area = "";
helper.Controller = "Home";
helper.Action = "Index";
}
Ответ №1:
Насколько я знаю, если вы хотите использовать IActionDescriptorCollectionProvider
в модульном тестировании, вы можете напрямую издеваться над ним, а затем использовать delegate с ним.
Более подробную информацию вы можете найти в приведенных ниже исходных кодах демонстрационной версии:
Ответ №2:
Слишком поздно для u .. но для кого-то другого, кто решает эту проблему.. Я только что использовал этот класс
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Moq;
using System.Collections.Generic;
public abstract class ActionDescriptorCollectionProviderMock
{
public static readonly IActionDescriptorCollectionProvider ADCP = GetADCP();
private static IActionDescriptorCollectionProvider GetADCP()
{
var actionDescriptorCollectionProviderMock = new Mock<IActionDescriptorCollectionProvider>();
actionDescriptorCollectionProviderMock.Setup(m => m.ActionDescriptors).Returns(new ActionDescriptorCollection(new List<ActionDescriptor>(), 0));
return actionDescriptorCollectionProviderMock.Object;
}
}
и в тесте:
[Fact]
public async void GetByIdTest()
{
//Arrange
var controller = new SomeController(ActionDescriptorCollectionProviderMock.ADCP);
//Act
...
//Assert
...
}