VS2019中NUnit测试无法识别主项目Entity Framework的问题排查
运行NUnit测试时出现以下错误:
System.InvalidOperationException : No connection string named 'HPCEntities' could be found in the application config file.
环境说明:
- 两个相邻目录的项目:Web应用(启动项目) + NUnit测试项目
- 已尝试的操作:
- 将Web应用的Web.config完整复制到测试项目目录,无效
- 创建仅包含目标连接字符串的app.config放在测试项目根目录,无效
测试项目的.csproj内容:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> <RootNamespace>HPC_NUnit_Tests</RootNamespace> <IsPackable>false</IsPackable> </PropertyGroup> <ItemGroup> <None Remove=".gitignore" /> <None Remove="Web.config" /> </ItemGroup> <ItemGroup> <Content Include="Web.config" /> </ItemGroup> <ItemGroup> <PackageReference Include="EntityFramework" Version="6.4.4" /> <PackageReference Include="nunit" Version="3.12.0" /> <PackageReference Include="NUnit3TestAdapter" Version="3.15.1" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.4.0" /> <PackageReference Include="RhinoMocks" Version="3.6.0" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\HPCv4\HPCv4.csproj" /> </ItemGroup> </Project>
测试项目的app.config内容:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="HPCEntities" connectionString="metadata=res://*/DataModel.HPCEntity.csdl|res://*/DataModel.HPCEntity.ssdl|res://*/DataModel.HPCEntity.msl;provider=System.Data.SqlClient;provider connection string="data.../> </connectionStrings> </configuration>
测试的SetUp方法代码:
private IMasterWipRepository repo; [SetUp] public void SetUp() { HPCEntityContext entity = new HPCEntityContext(); IRepositoryFactory repoFactory = RepositoryFactory.GetTest(entity); repo = repoFactory.GetMasterWipRepo(); }
存在的配置错误/缺失
配置文件识别逻辑错误
.NET Core测试项目只会自动读取app.config,测试项目中添加的Web.config不会被测试运行时识别,且.csproj中特意将Web.config设为Content类型,属于无效操作。app.config未正确复制到输出目录
即使创建了app.config,如果未设置“复制到输出目录”属性,编译后测试运行的输出目录中不会存在该文件,导致EF6无法读取连接字符串。连接字符串不完整
提供的app.config中连接字符串内容被截断(结尾为data.../>),会导致XML配置文件解析失败,EF6无法找到有效连接字符串。EF6在.NET Core中的配置读取兼容性问题
EF6原本为.NET Framework设计,在.NET Core项目中读取配置的逻辑有差异,且依赖版本存在潜在冲突(例如Microsoft.NET.Test.Sdk版本16.4.0相对老旧,与netcoreapp3.1可能存在兼容性问题)。
修复步骤
移除无效的Web.config配置
删除测试项目中的Web.config文件,同时删掉.csproj中以下相关配置节点:<ItemGroup> <None Remove=".gitignore" /> <None Remove="Web.config" /> </ItemGroup> <ItemGroup> <Content Include="Web.config" /> </ItemGroup>确保app.config复制到输出目录
在测试项目的.csproj中添加以下配置,保证app.config会被复制到输出目录:<ItemGroup> <None Update="app.config"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup>修复连接字符串
补全app.config中被截断的连接字符串,确保XML标签完整闭合,正确格式示例:<add name="HPCEntities" connectionString="metadata=res://*/DataModel.HPCEntity.csdl|res://*/DataModel.HPCEntity.ssdl|res://*/DataModel.HPCEntity.msl;provider=System.Data.SqlClient;provider connection string="data source=YOUR_SERVER;initial catalog=YOUR_DB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />显式指定连接字符串(可选)
如果配置读取仍有问题,可在实例化HPCEntityContext时显式传入连接字符串名称:HPCEntityContext entity = new HPCEntityContext("HPCEntities");升级依赖版本
将测试项目的相关依赖升级到兼容netcoreapp3.1的较新版本,例如:nunit升级到3.13.3+NUnit3TestAdapter升级到3.17.0+Microsoft.NET.Test.Sdk升级到16.11.0+
内容的提问来源于stack exchange,提问作者Doug Gardiner

