【问题标题】:Setting up IActionDescriptorCollectionProvider for a unit test为单元测试设置 IActionDescriptorCollectionProvider
【发布时间】:2020-11-09 14:01:27
【问题描述】:

我目前正在为在其构造函数中使用IActionDescriptorCollectionProviderTagHelper 编写单元测试。到目前为止,我的设置如下所示 - 关于如何设置满足 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";  
}

【问题讨论】:

    标签: c# unit-testing asp.net-core


    【解决方案1】:

    据我所知,如果你想在单元测试中使用IActionDescriptorCollectionProvider,你可以直接模拟它,然后使用委托。

    更多细节,您可以参考下面的测试演示源代码:

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

    【讨论】:

      【解决方案2】:

      对你来说太晚了..但是对于其他人来说这个问题..我刚用过这个类

      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
              ...        
          }
      

      【讨论】:

        猜你喜欢
        • 2017-08-31
        • 2022-01-09
        • 1970-01-01
        • 2014-11-25
        • 2022-01-23
        • 1970-01-01
        • 2016-03-29
        • 2014-03-02
        • 1970-01-01
        相关资源
        最近更新 更多