如何将 MSTest 项目使用的 app.config 设置迁移到 .NET 5

How to migrate app.config settings used by an MSTest project to .NET 5

我正在将使用 .NET Framework 4.6.1 的 ASP.NET Web API 解决方案迁移到 ASP.NET Core 5 / .NET Framework 5。除了 Web API 项目有一个基于 MSTest 的测试项目,它与 Web API 项目共享连接字符串信息。这看起来如下:

Web API 项目有一个 Web.config 文件,其中包含以下代码:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings configSource="bin\ConnectionInfo.config" />
  ...
</configuration>

基于 MSTest 的项目有一个 App.config 文件,其中包含以下代码:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/>
  </startup>
  <connectionStrings configSource="ConnectionInfo.config"/>
</configuration>

因此,以上两个文件都引用了 ConnectionInfo.config,其中包含实际的连接字符串,如下所示:

<connectionStrings>
  <add name="MyConnectionString" connectionString="the connection string" />
</connectionStrings>

该设置确保我只有一个点需要更改连接字符串以将应用程序指向另一个数据库。

最后,我检索了测试数据库中的连接字符串并将其传递给我的 DatabaseManager,它提供了创建和重置数据库的功能:

string connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
_databaseManager = new DatabaseManager(connectionString);

现在,在将 Web API 项目迁移到 ASP.NET Core 5 之后,Web.config 被替换为 appsettings.json 文件。每个环境都有一个这样的文件,每个文件都包含该环境的连接字符串。

有没有什么办法可以把相应的连接字符串共享给测试项目?我不想在该项目中手动加载 appsettings.json,但希望有一个内置机制。有什么可以帮助的吗?

您可以使用现有的app.config来保存连接字符串,就像.NET 5.0中的.NET Framework中的连接字符串一样,只需将System.Configuration.ConfigurationManager的nuget包添加到单元测试项目中,并使用ConfigurationManager.ConnectionStrings 与之前在 .NET Framework 中一样。

最新稳定版为v5.0.0.

另请参阅 nuget 页面 https://www.nuget.org/packages/System.Configuration.ConfigurationManager/5.0.0

和文档: https://docs.microsoft.com/en-us/dotnet/api/system.configuration.configurationmanager.connectionstrings?view=windowsdesktop-5.0

有一件事可以肯定,System.Configuration.ConfigurationManager nuget 包主要是 Windows 特定的,在文档中它作为 .NET 的“Windows Desktop”的一部分包含在内5.0,不是 .NET 5.0 的完整跨平台。

为了从测试项目中读取存储在主项目 appsettings.json 中的连接字符串,我向其中添加了 NuGet 包 Microsoft.Extensions.Configuration.Json

然后,我确保 appsettings.json 文件被主项目复制到输出目录,这可以在 .csproj 文件中按如下方式完成:

<ItemGroup>
  <None Include="appsettings.Development.json">
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
  </None>
  <None Include="appsettings.json">
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
  </None>
</ItemGroup>

最后在测试项目中我通过读取appsettings.json文件获取连接字符串如下:

protected static readonly string _connectionString = new ConfigurationBuilder()
  .SetBasePath(AppContext.BaseDirectory)
  .AddJsonFile("appsettings.json", false, true)
  .Build()
  .GetConnectionString("ConnectionStringKeyName");