gpt4 book ai didi

c# - WebApi 2 中的单元测试 IAuthenticationFilter

转载 作者:可可西里 更新时间:2023-11-01 08:38:07 26 4
gpt4 key购买 nike

我正在尝试对我为 WebApi 2 项目编写的基本身份验证过滤器进行单元测试,但我无法模拟 OnAuthentication 调用中所需的 HttpAuthenticationContext 对象。

public override void OnAuthentication(HttpAuthenticationContext context)
{
base.OnAuthentication(context);

var authHeader = context.Request.Headers.Authorization;

... the rest of my code here
}

我试图为模拟设置的实现行是设置 authHeader 变量的行。

但是,我无法模拟 Headers 对象,因为它是密封的。而且我不能模拟请求并设置模拟 header ,因为它是一个非虚拟属性。依此类推,一直到上下文。

有没有人成功地对新的 IAuthenticationFilter 实现进行单元测试?

我正在使用 Moq,但如果您有示例代码,我相信我可以在任何模拟库中进行操作。

感谢您的帮助。

最佳答案

有可能实现您想要的结果,因为链上下文中没有任何对象。Request.Headers.Authorization 公开虚拟属性 Mock 或任何其他框架不会为您提供太多帮助。以下是使用模拟值获取 HttpAuthenticationContext 的代码:

HttpRequestMessage request = new HttpRequestMessage();
HttpControllerContext controllerContext = new HttpControllerContext();
controllerContext.Request = request;
HttpActionContext context = new HttpActionContext();
context.ControllerContext = controllerContext;
HttpAuthenticationContext m = new HttpAuthenticationContext(context, null);
HttpRequestHeaders headers = request.Headers;
AuthenticationHeaderValue authorization = new AuthenticationHeaderValue("scheme");
headers.Authorization = authorization;

您只需要简单地以普通方式创建某些对象,然后使用构造函数或属性将它们传递给其他对象。我创建 HttpControllerContext 和 HttpActionContext 实例的原因是因为 HttpAuthenticationContext.Request 属性只有一部分 - 它的值可以通过 HttpControllerContext 设置。使用上面的方法,您可以测试您的过滤器,但是您无法在测试中验证上面对象的某些属性是否被触及,仅仅是因为它们不可覆盖 - 否则就不可能跟踪这一点。

关于c# - WebApi 2 中的单元测试 IAuthenticationFilter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24683676/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com