【问题标题】:.net standard ConfigurationManager opens wrong app.config.net 标准 ConfigurationManager 打开错误的 app.config
【发布时间】:2017-11-08 15:00:57
【问题描述】:

我正在尝试通过 .net 标准项目从 .net 核心单元测试项目运行测试方法,并在加载测试项目中的配置文件时(因为这是当前正在执行的程序集)。我得到了一个错误的配置文件,当前文件路径为“C:\Users\xxx\.nuget\packages\microsoft.testplatform.testhost\15.3.0-preview-20170628-02\lib\netstandard1.5\testhost. dll.config"

 var conf = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

【问题讨论】:

  • 为什么你认为这是错误的配置?你的单元测试的执行路径是什么? .NET Core 根本不使用 app.config 是有原因的。你应该注入配置,而不是硬编码它的加载器
  • 哦!得到你所说的。我第一次使用 .net core 进行单元测试时,我没想到执行的主机路径与原来的不同。我该如何注射?

标签: c# unit-testing .net-core .net-standard


【解决方案1】:

您可以选择指向另一个配置文件。来源的功劳归功于 Ron Hagerman 的 answer,只做了轻微的修改。以下 xunit 测试可能有助于理解如何设置位置。令人沮丧的是.net核心单元测试在以下目录的testhost.dll.config文件中寻找连接字符串

C:\Users\[用户名]\.nuget\packages\microsoft.testplatform.testhost\[版本]\lib\netstandard1.5\testhost.dll.config

[Fact]
public void AccessAppSettings_ConnectionString()
{
     //obtain the current directory for the executable
     Uri UriAssemblyFolder = new Uri(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly()
                                           .GetName().CodeBase));
     string appPath = UriAssemblyFolder.LocalPath;
     //Change the "DataProvider.Tests.dll" to whatever your 
     //library or executable name. 
     //Note: Configuration manager will add the .config extension
     Configuration config = ConfigurationManager
            .OpenExeConfiguration(appPath + @"\" + "DataProvider.Tests.dll");

     ConnectionStringsSection section = 
                  config.GetSection("connectionStrings") as ConnectionStringsSection;

     string expectedString = $"Data Source=mysqliteDBName.sqlite3";
     //Change "mySqliteConnectionString" to your connection string name   
     var sut_connectionString = 
                 section.ConnectionStrings ["mySqliteConnectionString"].ConnectionString;

      Assert.NotNull(sut_connectionString);
      Assert.Contains(expectedString, sut_connectionString);

示例配置文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <connectionStrings>
        <add name="mySqliteConnectionString" connectionString="Data Source=mysqliteDBName.sqlite3" />
        <add name="otherConnectionString" connectionString="Data Source=othersqliteDBName.sqlite3" />
    </connectionStrings>
</configuration>

【讨论】:

    【解决方案2】:

    我不认为你弄错了。您正在获取测试项目的配置文件,这是正确的,因为您正在运行测试项目。

    每个项目都有自己的配置文件或没有。它不能只是去加载另一个项目的配置文件。

    底线是:只需将您想要的任何特定配置从 .net 标准项目的配置文件复制到单元测试的配置文件中。

    【讨论】:

    • 我的 App.config 在测试项目中查看我发布它的路径 来自 nugget 文件夹的路径
    猜你喜欢
    • 2010-11-19
    • 2010-10-09
    • 2013-09-13
    • 2017-07-11
    • 2011-08-02
    • 2019-06-21
    • 1970-01-01
    • 2013-09-06
    • 2023-04-06
    相关资源
    最近更新 更多