如何在委托上模拟异常以测试MVC Filter的特定分支
如何模拟ActionFilter中next()抛出异常以测试异常分支
要触发ActionFilter里的else分支,核心是让next()执行后返回的ActionExecutedContext包含非空的Exception属性,有两种简单实现方式:
方式一:直接构造带异常的ActionExecutedContext
修改你的MockDelegate,返回一个已经设置了Exception的ActionExecutedContext实例:
Task<ActionExecutedContext> MockDelegate() => Task.FromResult( new ActionExecutedContext(executionContext.ActionContext, null, null!) { Exception = new InvalidOperationException("模拟业务操作异常") });
方式二:让MockDelegate直接抛出异常
也可以让next委托在执行时直接抛出异常,Asp.Net Core框架会自动将其包装成带异常的ActionExecutedContext:
Task<ActionExecutedContext> MockDelegate() => throw new InvalidOperationException("模拟业务操作异常");
修改后的完整测试代码
这里用方式一的实现为例,替换原代码中的MockDelegate即可:
public async Task ExecuteControllerOperation_EXCEPTION_IN_OPERATION_Success() { //arrange var actionFilter = new TransactionSupportActionFilter(); var executionContext = CreateDefaultActionContext(new List<string>()); // 修改MockDelegate,返回带异常的上下文 Task<ActionExecutedContext> MockDelegate() => Task.FromResult( new ActionExecutedContext(executionContext.ActionContext, null, null!) { Exception = new InvalidOperationException("模拟业务操作抛出的异常") }); var actionExecutingContext = new ActionExecutingContext( executionContext.ActionContext, new List<IFilterMetadata>(), new Dictionary<string, object>(), controller: null!); //act await actionFilter.OnActionExecutionAsync(actionExecutingContext, MockDelegate); //assert Assert.True(executionContext.HttpContext.Response.Headers.ContainsKey(HttpHeaderKey), "Missing header"); Assert.True(executionContext.HttpContext.Response.Headers[HttpHeaderKey].ToString() == Other, $"Expecting {Other} type"); }
这样修改后,ActionFilter中的result.Exception就会不为null,自然会进入你要测试的else分支。
内容的提问来源于stack exchange,提问作者advapi
相关产品推荐
相关产品推荐

