ResultFilterAttribute 单元测试没有看到更改的结果

问题描述

我正在尝试测试我的 ResultFilterattribute。当我逐步调试调试器时,我看到 context.Result 被设置,但随后在测试中 Assert 失败,因为状态代码的值仍然为 200。我设置测试的方式有什么问题?

public class ETagFilterattribute : ResultFilterattribute
{
    public override void OnResultExecuting(ResultExecutingContext context)
    {
        var request = context.HttpContext.Request;

        if (!(request.Method == "GET" && context.Result is ObjectResult obj && obj.Value is IGenerateEtag entity)) {
            base.OnResultExecuting(context);
            return;
        }

        var etag = $"\"{entity.GenerateEtag()}\"";
        context.HttpContext.Response.Headers["ETag"] = etag;

        var ifNoneMatch = request.Headers["if-none-match"];
        if (ifNoneMatch != StringValues.Empty)
            return;

        foreach (var value in ifNoneMatch.ToArray())
            if (value == etag) {
                context.Result = new StatusCodeResult((int)HttpStatusCode.NotModified);
                break;
            }
    }
}

我正在使用这个 Xunit 测试:

[Fact]
public async Task ShouldReturnNotModified()
{
    var result = new Value();
    var ctx = CreateResultExecutingContext(result);

    var etag = result.GenerateEtag();
    ctx.HttpContext.Request.Headers.Add("if-none-match",$"\"{etag}\"");

    var filter = new ETagFilterattribute();
    filter.OnResultExecuting(ctx);
            
    Assert.Equal(StatusCodes.Status304NotModified,ctx.HttpContext.Response.StatusCode);
}

答案:

感谢@Nkosi,我能够通过用这个替换最后一个 Assert解决它:

var actionResult = Assert.IsType<StatusCodeResult>(ctx.Result);
Assert.Equal(StatusCodes.Status304NotModified,actionResult.StatusCode);

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)