单元测试项目无法引用System.Web.Http的问题求助
我之前也踩过这个坑!没法在单元测试项目里引用System.Web.Http、用不了IHttpActionResult,但主项目正常,这种情况基本都是测试项目和主项目的框架/依赖不匹配导致的,下面给你说具体原因和解决办法:
- 框架版本不兼容:如果你的主项目是基于.NET Framework的ASP.NET Web API,但单元测试项目用了.NET Core/.NET 5+,或者两者的.NET Framework版本不一样(比如主项目4.8,测试项目4.5),就会找不到
System.Web.Http——这个命名空间是传统ASP.NET Web API(.NET Framework专属)的组件,.NET Core系列用的是完全不同的Microsoft.AspNetCore.Mvc体系。 - 缺失必要的NuGet包:主项目可能已经通过NuGet安装了
Microsoft.AspNet.WebApi.Core(System.Web.Http就在这个包里),但单元测试项目没有单独安装这个包,依赖没有传递过来,自然引用不了。 - 测试项目类型选错:创建测试项目时选了针对.NET Core的模板,但主项目是.NET Framework的Web API,两者的依赖体系完全不搭。
1. 统一目标框架版本
右键你的单元测试项目 → 「属性」→ 「应用程序」标签页,把「目标框架」改成和主项目完全一致的版本。比如主项目用的是.NET Framework 4.7.2,测试项目也得改成4.7.2,不能用.NET Core/.NET 6+。
2. 安装对应的NuGet包
打开测试项目的NuGet包管理器(右键项目 → 「管理NuGet程序包」),搜索并安装Microsoft.AspNet.WebApi.Core包。安装完成后,你就能在测试类里正常写using System.Web.Http;,并使用IHttpActionResult了。
3. 修正测试项目类型(如果选错了)
如果一开始创建测试项目时选了.NET Core的模板,要么直接新建一个「单元测试项目(.NET Framework)」,要么手动修改测试项目的.csproj文件:
打开.csproj,把类似<TargetFramework>net6.0</TargetFramework>的节点改成对应.NET Framework的版本,比如<TargetFramework>net48</TargetFramework>,然后重新加载项目,再安装上面的NuGet包。
额外提示
如果你的主项目是.NET Core/.NET 6+的Web API(不是传统的ASP.NET Web API),那本来就没有System.Web.Http这个命名空间,你应该用Microsoft.AspNetCore.Mvc里的IActionResult,这时候要确保测试项目也用相同的.NET Core/.NET版本,并安装Microsoft.AspNetCore.Mvc.Core包。
内容的提问来源于stack exchange,提问作者Thomas

