gpt4 book ai didi

mocking - 使用模拟 HttpMessageHandler 时如何使用 HttpClient 管理 cookie

转载 作者:行者123 更新时间:2023-12-02 15:26:48 25 4
gpt4 key购买 nike

我有一个单元测试,它通过传入 HttpRequestMessage 实例并接收返回的 HttpResponseMessages 实例来调用类库。在这方面,它与测试 WebApi ApiController 非常相似。

我正在测试的代码将 cookie 添加到 HttpResponseMessage 中,并期望在后续传入的 HttpRequestMessage 调用中看到这些 cookie,这就是浏览器(或 >HttpWebRequest) 会表现出来。

我没有使用 HttpClientHandler 因为请求实际上并未在网络上进行,而是使用我初始化的模拟 HttpMessageHandler 传递给产品HttpClient 与。因此,我无法访问 HttpClientHandler 中的 cookie 处理。看来,要获得我需要的 cookie 行为,我必须手动解析 HttpResponseMessage 中的 cookie,然后手动将它们序列化到 HttpRequestMessage 中。这也完全忽略了 CookieContainer 正确应用 cookie 到正确请求的逻辑。

有没有更简单的方法?

最佳答案

我编写了自己的DelegatingHandler来为我管理cookie。我还在 CookieContainer 上编写了几个扩展方法,以便可以轻松地与 HttpRequestMessage 和 HttpResponseMessage 一起使用:

internal class DangerouslySimpleCookieContainer : DelegatingHandler {
internal DangerouslySimpleCookieContainer(CookieContainer cookieContainer = null) {
this.Container = cookieContainer ?? new CookieContainer();
}

internal DangerouslySimpleCookieContainer(HttpMessageHandler innerHandler, CookieContainer cookieContainer = null)
: base(innerHandler) {
this.Container = cookieContainer ?? new CookieContainer();
}

public CookieContainer Container { get; set; }

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) {
this.Container.ApplyCookies(request);
var response = await base.SendAsync(request, cancellationToken);
this.Container.SetCookies(response);
return response;
}
}

internal static class CookieContainerExtensions {
internal static void SetCookies(this CookieContainer container, HttpResponseMessage response, Uri requestUri = null) {
Requires.NotNull(container, "container");
Requires.NotNull(response, "response");

IEnumerable<string> cookieHeaders;
if (response.Headers.TryGetValues("Set-Cookie", out cookieHeaders)) {
foreach (string cookie in cookieHeaders) {
container.SetCookies(requestUri ?? response.RequestMessage.RequestUri, cookie);
}
}
}

internal static void ApplyCookies(this CookieContainer container, HttpRequestMessage request) {
Requires.NotNull(container, "container");
Requires.NotNull(request, "request");

string cookieHeader = container.GetCookieHeader(request.RequestUri);
if (!string.IsNullOrEmpty(cookieHeader)) {
request.Headers.TryAddWithoutValidation("Cookie", cookieHeader);
}
}
}

关于mocking - 使用模拟 HttpMessageHandler 时如何使用 HttpClient 管理 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15588214/

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