Настройка IActionDescriptorCollectionProvider для модульного теста

#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 с ним.

Более подробную информацию вы можете найти в приведенных ниже исходных кодах демонстрационной версии:

https://github.com/dotnet/aspnetcore/blob/c565386a3ed135560bc2e9017aa54a950b4e35dd/src/Mvc/Mvc.Core/test/Routing/ActionEndpointDataSourceBaseTest.cs

Ответ №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
        ...        
    }