首页 > 解决方案 > 如何使用 Xunit 对 ActionFilterAttribute 的 OnActionExecuting() 进行单元测试

问题描述

这是在ASP.net core 3.1中,使用XUnitNSubstitute(业务规则限制为这些框架)

我有一个ActionFilterAttribute派生的模型验证过滤器(取自这篇文章:Validate the Model State Globally in .NET Core),我需要对其进行单元测试。

我无法让测试正常工作,因为无论我尝试什么,我都会返回 null。

下面的测试代码基于 2017 年的 Stack Overflow 帖子:如何对 ActionFilterAttribute 进行单元测试


我要测试的代码:

public class ModelStateAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if (!context.ModelState.IsValid)
        {
            context.Result = new BadRequestObjectResult(context.ModelState);
        }
    }
}

我的测试

public class ModelStateAttributeTests
{
    private readonly IFileCache _fileCache = new FileCache();

    [Fact]
    public void OnActionExecuting_ShouldNotBeNull()
    {
        //Arrange
        var httpContext = new DefaultHttpContext();
        var context = new ActionExecutingContext(
            new ActionContext
            {
                HttpContext = httpContext,
                RouteData = new RouteData(),
                ActionDescriptor = new ActionDescriptor(),
            },
            new List<IFilterMetadata>(),
            new Dictionary<string, object>(), new TestController(_fileCache));
        var sut = new ModelStateAttribute();

        //Act
        sut.OnActionExecuting(context);

        //Assert
        context.Result.Should().NotBeNull();
    }
}

错误信息:

Test Name:  AppName.Tests.Attributes.ModelStateAttributeTests.OnActionExecuting_ShouldNotBeNull
Test FullName:  AppName.Tests.AppName.Tests.Attributes.ModelStateAttributeTests.AppName.Tests.Attributes.ModelStateAttributeTests.OnActionExecuting_ShouldNotBeNull
Test Source:    C:\repos\AppName\AppName.Tests\Attributes\ModelStateAttributeTests.cs : line 20
Test Outcome:   Failed
Test Duration:  0:00:00

Test Name:  AppName.Tests.Attributes.ModelStateAttributeTests.OnActionExecuting_ShouldNotBeNull
Test Outcome:   Failed
Result StackTrace:  
at FluentAssertions.Execution.XUnit2TestFramework.Throw(String message)
   at FluentAssertions.Execution.TestFrameworkProvider.Throw(String message)
   at FluentAssertions.Execution.DefaultAssertionStrategy.HandleFailure(String message)
   at FluentAssertions.Execution.AssertionScope.FailWith(Func`1 failReasonFunc)
   at FluentAssertions.Execution.AssertionScope.FailWith(Func`1 failReasonFunc)
   at FluentAssertions.Execution.AssertionScope.FailWith(String message, Object[] args)
   at FluentAssertions.Primitives.ReferenceTypeAssertions`2.NotBeNull(String because, Object[] becauseArgs)
   at AppName.Tests.Attributes.ModelStateAttributeTests.OnActionExecuting_ShouldNotBeNull()
Result Message: Expected object not to be <null>.

标签: c#unit-testingasp.net-coretestingxunit

解决方案


推荐阅读