asp.net-mvc - 客户 ActionFilterAttribute 的单元测试失败

标签 asp.net-mvc unit-testing asp.net-core

该项目是aspnet core 2.1,我使用客户ActionFilterAttribute如下:

public override void OnActionExecuting(ActionExecutingContext context)
        { 
            var descriptor = context.ActionDescriptor as ControllerActionDescriptor;
            if (descriptor != null)
            {
                foreach (var parameter in descriptor.MethodInfo.GetParameters())
                {
                    object args = null;
                    if (context.ActionArguments.ContainsKey(parameter.Name))
                    {
                        args = context.ActionArguments[parameter.Name];
                    }

                    ValidateAttributes(parameter, args, context.ModelState);
                }
            }

            if (!context.ModelState.IsValid)
            {
                context.Result = new BadRequestObjectResult(context.ModelState);
            }
        }

现在我添加一个单元测试代码来测试过滤器,

[TestMethod]
        public void ValidateModelAttributes_SetsResultToBadRequest_IfModelIsInvalid()
        {
            var validationFilter = new ValidateModelStateAttribute();
            var modelState = new ModelStateDictionary();
            modelState.AddModelError("name", "invalid");
            var actionDescriptor = new ActionDescriptor();

            var actionContext = new ActionContext(
                Mock.Of<HttpContext>(),
                Mock.Of<RouteData>(),
                Mock.Of<ActionDescriptor>(),
                modelState
            );

            var actionExecutingContext = new ActionExecutingContext(
                actionContext,
                new List<IFilterMetadata>(),
                new Dictionary<string, object>() { { "1", "1" } },
                Mock.Of<Controller>()
            );

            validationFilter.OnActionExecuting(actionExecutingContext);

            Assert.IsNotNull(actionExecutingContext.Result);
        }

但描述符总是返回 null:

var descriptor = context.ActionDescriptor as ControllerActionDescriptor;

你能帮我修复单元测试代码吗?

最佳答案

but the descriptor always return null`,

那是因为在测试中a Mock.Of<ActionDescriptor>()这将是 ActionDescriptor使用,但测试中的主题转换为 ControllerActionDescriptor ,模拟不是,因此为 null。

使用适当的模拟

//...omitted for brevity

var actionContext = new ActionContext(
    Mock.Of<HttpContext>(),
    Mock.Of<RouteData>(),
    Mock.Of<ControllerActionDescriptor>(),
    modelState
);

//...omitted for brevity

您仍然需要设置模拟,以便访问的成员在执行测试时按预期运行

关于asp.net-mvc - 客户 ActionFilterAttribute 的单元测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59525461/

相关文章:

c# - 第一次外部登录尝试重定向回登录操作,第二次成功

c# - 实现接口(interface)的具体类是否应该有额外的公共(public)方法进行测试?

django - 模拟自定义文件存储后端

unit-testing - 如何在 Angular 2 中测试 *ngFor?

c# - 无法从派生自 ActionFilterAttribute 的类访问存储库(或 DbContext)

c# - 如何从 "ErrorMessage"翻译 "Custom Attribute"

asp.net-mvc - 对 MVC View 进行单元测试意味着什么?

javascript - UI-路由器。如何导航到项目中我不想包含为状态的页面?

javascript - MVC Kendo 网格自定义过滤器

c# - 使用 OWIN 从 asp.net 核心发布的 oAuth 承载