单元测试类实例化报System.TypeLoadException,无法加载System.Web.HttpContext类型
问题解决办法
报错核心原因
System.Web.HttpContext 是.NET Framework专属API,不存在于.NET Core/.NET 5+的System.Web程序集中,该报错90%以上场景是因为单元测试项目的目标框架与依赖GlobalObject的业务项目目标框架不匹配导致。
可行解决方案
- 方案1:对齐测试项目与业务项目的目标框架
若业务项目基于.NET Framework 4.x开发,将单元测试项目的目标框架改为对应版本的.NET Framework即可。操作路径:右键测试项目 → 「属性」→ 「应用」→ 「目标框架」,选择和业务项目一致的.NET Framework 4.x版本,重新生成项目即可解决程序集加载问题。 - 方案2:模拟Global对象绕开HttpContext依赖(适用于必须使用高版本.NET做测试的场景)
无需修改原业务代码,在测试构造函数中手动构造符合要求的Global对象,跳过原构造函数中访问HttpContext的逻辑:
若原Global构造函数仅需要取站点路径,可直接在测试启动时给AppDomain设置对应基础路径,非Web环境下public Tests() { // 可通过反射、子类继承重写等方式构造Global对象,手动赋值所需字段 Global testGlobal = new Global(); // 手动给Global对象的路径、错误处理实例等依赖赋值,无需触发HttpContext访问逻辑 State state = new State(testGlobal); }HttpContext.Current本身会返回null,不会触发后续MapPath调用,不会抛出类型加载异常。 - 方案3:添加编译条件兼容测试场景
若允许小幅调整业务代码,可在Global构造逻辑中加入编译条件判断,测试场景下直接使用测试环境路径:
后续在单元测试项目的编译常量中添加public Global() { #if UNIT_TEST string localPath = AppContext.BaseDirectory; #else string localPath = (System.Web.HttpContext.Current == null) ? string.Empty : System.Web.HttpContext.Current.Server.MapPath(""); #endif // 其余原有构造逻辑 }UNIT_TEST即可。
内容的提问来源于stack exchange,提问作者Andrew Rivera
相关产品推荐
相关产品推荐

