c# - 如何使用 Xunit 对 ActionFilterAttribute 的 OnActionExecuting() 进行单元测试
问题描述
这是在ASP.net core 3.1中,使用XUnit和NSubstitute(业务规则限制为这些框架)
我有一个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>.
解决方案
推荐阅读
- octave - 错误:octave_base_value::save_ascii(): 错误类型参数“对象”
- c# - 如何在 oAuth 2.0 - C# 中跳过用户同意并直接获取访问令牌
- arrays - 如何将这些单独的标签压缩为自定义 UICollectionView 单元格中的标签数组?
- asp.net-core - 角色/用户在 ASP.Net.Core.Identity 中可以拥有多少个声明?
- linux - linux中的“-Dprefix”有什么作用?
- python - 列表的居中平均值
- python - 如何尝试创建日期对象并将无效参数设置为 1?
- javascript - 下划线符号更改变量的可访问性
- python - Zabbix Action - 如何在自定义脚本中使用默认字段
- azure - 有没有办法以编程方式启用 Azure 的 management-api 内置 rest API?