You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在委托上模拟异常以测试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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 18:40:26