gpt4 book ai didi

c# - 如何对 Web api 2 的 AntiforgeryToken 过滤器进行单元测试

转载 作者:太空宇宙 更新时间:2023-11-03 15:26:20 25 4
gpt4 key购买 nike

我正在尝试使用 MsTest 为自定义过滤器编写单元测试用例,它具有为 ASP.NET WEB API 2 项目中的 POST 方法验证 Antiforgerytoken 的逻辑。

[AttributeUsage(AttributeTargets.Method, Inherited = true)]
public class ValidateJsonAntiForgeryTokenAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
try
{

string cookieToken = null;
string formToken = null;

if (actionContext.Request.IsAjaxRequest())
{
IEnumerable<string> tokenHeaders;
if (actionContext.Request.Headers.TryGetValues("__RequestVerificationToken", out tokenHeaders))
{
string[] tokens = tokenHeaders.First().Split(':');
if (tokens.Length == 2)
{
cookieToken = tokens[0].Trim();
formToken = tokens[1].Trim();
}
}
if (cookieToken != null && formToken !=null)
{
AntiForgery.Validate(cookieToken, formToken);
}
else
{
AntiForgery.Validate();
}
}

}
catch (Exception ex)
{
ErrorSignal.FromCurrentContext().Raise(ex);
actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Forbidden);
}
}
}

下面的代码中IsAjaxRequest是一个扩展方法

public static class HttpRequestMessageExtensions
{
public static bool IsAjaxRequest(this HttpRequestMessage request)
{
IEnumerable<string> headers;
if (request.Headers.TryGetValues("X-Requested-With", out headers))
{
var header = headers.FirstOrDefault();
if (!string.IsNullOrWhiteSpace(header))
{
return header.ToLowerInvariant() == "xmlhttprequest";
}
}

return false;
}
}

我的问题是如何模拟 IsAjaxRequest 以及如何将 actionContext 参数传递给 OnActionExecuting 方法。

谁能帮我提供一些与此相关的代码示例?

最佳答案

IsAjaxRequest 是一个扩展方法,这意味着它是一个静态方法。

你不应该模拟静态方法。您应该在测试行为下将其作为方法的一部分进行测试。

以下示例显示了如何测试无效请求:(我删除了::ErrorSignal.FromCurrentContext().Raise(ex); 因为我不知道要添加哪个程序集...所以在你的测试中添加缺少的断言......)

[TestMethod]
public void TestMethod1()
{
var target = new ValidateJsonAntiForgeryTokenAttribute();
var requestMessage = new HttpRequestMessage();
requestMessage.Headers.Add("X-Requested-With", new[] {"xmlhttprequest"});
var fakeDescriptor = new Mock<HttpActionDescriptor>();
var controllerContext = new HttpControllerContext {Request = requestMessage};
var context = new HttpActionContext(controllerContext, fakeDescriptor.Object);


target.OnActionExecuting(context);


Assert.AreEqual(HttpStatusCode.Forbidden, actionContext.Response.StatusCode);
}

关于c# - 如何对 Web api 2 的 AntiforgeryToken 过滤器进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35180694/

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