没有简单的方法来访问 response
对象中的 CookieContainer
运行与 AspNet.TestHost.TestServer
的集成测试。 Cookie 必须由 Controller 操作设置。实现这一目标的最佳方法是什么?
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 的相对较小的代码之外的逻辑。
关于如何在响应中实现对 Cookie 的访问,有什么更好的建议吗?
最佳答案
作为@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;
}
}
关于testing - 在 ASP.NET 5/MVC 6 上的 AspNet.TestHost.TestServer 上下文中访问单元测试内的 Cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32750457/