在使用CookieContainer运行集成测试的response对象中,没有简单的方法可以访问AspNet.TestHost.TestServer。 Cookie必须通过控制器操作来设置。做到这一点的最佳方法是什么?

            var client = TestServer.Create(app =>
            {
                app.UseMvc(routes =>
                       routes.MapRoute("default", "{controller}/{action}/{id?}"));
                app.UseIdentity();
            }).CreateClient();

            var request = new HttpRequestMessage(HttpMethod.Get, "account/login");
            var response = await client.SendAsync(request);

            // how to get an access to cookie container ?????????
            // response.Cookies prop doesn't exist
            Assert.NotEmpty(response.Cookies["auth"]);


我看到的解决方案是扩展TestServer的实例,返回类CustomClientHandler : ClientHandler的实例,并覆盖在该处理程序中发送请求的整个过程,但实际上需要更改所有逻辑,但相对较小的TestServer代码除外。

还有什么更好的建议,如何在响应中实现对Cookies的访问?

最佳答案

除了@Oleh的响应之外,您还可以实现同样的功能,而无需考虑.NET 4.6.1+ / .NET Core等较新的框架

public class TestHttpClientHandler : DelegatingHandler
{
    [NotNull]
    private readonly CookieContainer cookies = new CookieContainer();

    public TestHttpClientHandler([NotNull] HttpMessageHandler innerHandler)
        : base(innerHandler) { }

    [NotNull, ItemNotNull]
    protected override async Task<HttpResponseMessage> SendAsync([NotNull] HttpRequestMessage request, CancellationToken ct)
    {
        Uri requestUri = request.RequestUri;
        request.Headers.Add(HeaderNames.Cookie, this.cookies.GetCookieHeader(requestUri));

        HttpResponseMessage response = await base.SendAsync(request, ct);

        if (response.Headers.TryGetValues(HeaderNames.SetCookie, out IEnumerable<string> setCookieHeaders))
        {
            foreach (SetCookieHeaderValue cookieHeader in SetCookieHeaderValue.ParseList(setCookieHeaders.ToList()))
            {
                Cookie cookie = new Cookie(cookieHeader.Name.Value, cookieHeader.Value.Value, cookieHeader.Path.Value);
                if (cookieHeader.Expires.HasValue)
                {
                    cookie.Expires = cookieHeader.Expires.Value.DateTime;
                }
                this.cookies.Add(requestUri, cookie);
            }
        }

        return response;
    }
}

07-24 13:35