【问题标题】:How to migrate app.config settings used by an MSTest project to .NET 5如何将 MSTest 项目使用的 app.config 设置迁移到 .NET 5
【发布时间】:2021-12-11 04:13:31
【问题描述】:

我正在将使用 .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,但希望有一个内置机制。有什么可以帮助的吗?

【问题讨论】:

  • 您能否向我们展示一些有关如何设置集成测试的相关代码?否则,答案很可能会变得非常笼统,并且与您的具体情况无关。
  • 我添加了一些代码,应该指出我在测试项目中如何处理连接字符串。
  • 由于您在测试中查询数据库,您可以参考 msft 的集成测试文档,它应该可以立即解决您的问题:docs.microsoft.com/de-de/aspnet/core/test/…

标签: asp.net asp.net-web-api .net-5 appsettings


【解决方案1】:

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

最新的稳定版本是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 5.0 的“Windows 桌面”的一部分,而不是 .NET 5.0 的完整跨平台。

【讨论】:

    【解决方案2】:

    为了从测试项目中读取存储在主项目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");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-24
      • 2015-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-24
      • 2016-12-13
      • 2013-06-14
      相关资源
      最近更新 更多