unit-testing - 如何对 ActionFilterAttribute 进行单元测试

标签 unit-testing .net-core xunit xunit.net actionfilterattribute

我希望在 .NET Core 2.0 API 项目中测试 ActionFilterAttribute,并想知道实现它的最佳方法。请注意,我不是试图通过 Controller 操作来测试它,只是测试 ActionFilterAttribute 本身。

我该如何去测试这个:

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

最佳答案

创建上下文的实例将其传递给过滤器并断言预期的行为

例如

[TestClass]
public class ValidateModelAttributeTest {
    [TestMethod]
    public void Invalid_ModelState_Should_Return_BadRequestObjectResult() {
        //Arrange
        var modelState = new ModelStateDictionary();
        modelState.AddModelError("", "error");
        var httpContext = new DefaultHttpContext();
        var context = new ActionExecutingContext(
            new ActionContext(
                httpContext: httpContext,
                routeData: new RouteData(),
                actionDescriptor: new ActionDescriptor(),
                modelState: modelState
            ),
            new List<IFilterMetadata>(),
            new Dictionary<string, object>(),
            new Mock<Controller>().Object);

        var sut = new ValidateModelAttribute();

        //Act
        sut.OnActionExecuting(context);

        //Assert
        context.Result.Should().NotBeNull()
            .And.BeOfType<BadRequestObjectResult>();
    }
} 

关于unit-testing - 如何对 ActionFilterAttribute 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46162940/

相关文章:

reactjs - React - Jest - 测试 preventDefault Action

python - 在 Python 中测试回退导入

java - Java 类的 Groovy Spock 测试 - 如何模拟 Clob

asp.net-core - .Net Core 中间件多次点击页面请求

testing - 使用多个数据库连接运行多个单元测试

ruby-on-rails - 所有 rspec 测试在它们不应该通过时通过(Rails 3.2,Rspec)

c# - WPF 控件库目标 .NET Core 3 或 .NET Framework?

c# - 引用 DNXCore5 错误,StringComparer .NET5

c# - 只有第一次记录显示,除非强行处置

c# - 使用 Moq 设置 Mock 存储库