Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用HttpServer/HttpClient集成测试ASP.NET Web API 2;没有HttpContext_C#_Asp.net_Cookies_Asp.net Web Api - Fatal编程技术网

C# 使用HttpServer/HttpClient集成测试ASP.NET Web API 2;没有HttpContext

C# 使用HttpServer/HttpClient集成测试ASP.NET Web API 2;没有HttpContext,c#,asp.net,cookies,asp.net-web-api,C#,Asp.net,Cookies,Asp.net Web Api,我希望集成测试一个基于ASP.NETWebAPI 2构建的web服务。许多事情,如cookies、获取当前主体等,都是通过HttpContext.current完成的 我在集成测试ASP.NET上找到了以下资源: 这很有效。它启动了一个内存主机,并与EntityFramework6的自动模式生成相结合,安装和拆卸都很容易 问题出现在尝试使用HttpContext.Current时,如上所述,获取Cookie/等。当使用HttpServer在内存中托管时,HttpContext.Current似

我希望集成测试一个基于ASP.NETWebAPI 2构建的web服务。许多事情,如cookies、获取当前主体等,都是通过HttpContext.current完成的

我在集成测试ASP.NET上找到了以下资源:

这很有效。它启动了一个内存主机,并与EntityFramework6的自动模式生成相结合,安装和拆卸都很容易

问题出现在尝试使用HttpContext.Current时,如上所述,获取Cookie/等。当使用HttpServer在内存中托管时,HttpContext.Current似乎总是空的。考虑到没有真正的请求,这确实有点道理,但这是一个难题——这意味着集成测试不能覆盖任何需要此属性的内容


我能在这里做什么?看起来除了HttpContext.Current之外,我使用的数据几乎不存在于任何地方,所以我必须在IIS上启动完整的外部实例吗?

为了使用自主机测试您的api,您必须避免从web api上下文调用
HttpContext.Current
。你可以用你可以模仿的东西来包装它,比如:

public static class CurrentHttpContext
{
    public static Func<HttpContextBase> Instance = () => new HttpContextWrapper(HttpContext.Current);
}
然后在需要访问的任何地方使用此选项:

var context = CurrentHttpContext.Instance();
// do what you need to do to httpcontext now like setting principal, cookies etc

您可以始终使用HttpClient或RestSharp从测试中直接调用Web API服务。是的,效果很好,谢谢。我只需要一个简单的方法来设置和删除测试中的WebAPI实例。如果我在模仿任何东西,这难道不是一个单元测试吗?我不能进行集成测试,比如会话处理、用户数据分离等。如果我必须手动进行集成测试。如果你仍然在访问数据库,我认为这不会使它成为一个单元测试。也许您可以给出一个示例,说明如何从web api上下文中使用HttpContext?我需要能够从一个高级api使用者级别测试身份验证和授权是否有效。一些正在使用的工具(其中一些是第三方的)依赖于HttpContext.Current来实现这一点。啊,我明白了。然后你就完蛋了:/或者你可以将第三方libs更改为与HttpContext.Current没有那么紧密联系的内容。就像Thinktecture()我想我必须这么做是的。谢谢
var context = CurrentHttpContext.Instance();
// do what you need to do to httpcontext now like setting principal, cookies etc