问题描述
我正在尝试测试我的 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 (将#修改为@)