testing - 在 ASP.NET 5/MVC 6 上的 AspNet.TestHost.TestServer 上下文中访问单元测试内的 Cookie

标签 testing cookies owin asp.net-core asp.net-core-mvc

没有简单的方法来访问 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/

相关文章:

c++ - 一旦代码进入另一个函数如何保留值

javascript - iOS 7 中的跨域 cookie

asp.net-web-api - ASP 身份 OAuth token - 我应该在移动应用程序流中使用 ValidateClientAuthentication() 和 Secret 吗?

javascript - 如何使用jquery Cookie?

javascript - 重定向到其他页面时 IE10 中的 Cookie 丢失

asp.net - 如何从 ASP.net 中的主体获取电子邮件地址?

c# - OWIN 自托管中的 Nancy 和 WebAPI 路由冲突

java - 如何在 Spock Groovy 的 THEN 阶段中预期的模拟方法调用后设置变量?

testing - 如何对项目中除 vendor 包之外的所有测试文件运行 go test

testing - Rails 4 参数缺失,Rspec 测试嵌套资源 Controller 更新方法