在.NET Core控制台应用程序中将app.config文件与NUnit3一起使用

时间:2019-04-05 19:06:18

标签: c# .net-core nunit app-config nunit-3.0

环境:

我的解决方案中目前有三个项目:

  • 具有一些我要测试的代码的.NET Standard 2.0库。
  • .NET Core 2.2控制台应用程序,它引用该库以确保其正常工作。
  • 使用VS中的“ NUnit测试项目”模板创建的.NET Core 2.2控制台应用程序。

我的测试项目中的依赖项全部来自NuGet:

  • Moq版本=“ 4.10.1”
  • nunit“ Version =” 3.11.0“
  • NUnit.ConsoleRunner“ Version =” 3.10.0“
  • NUnit3TestAdapter“版本=” 3.13.0“
  • Microsoft.NET.Test.Sdk“ Version =” 16.0.1“

问题:

.NET标准库依赖于任何使用它的应用程序中存在的app.config文件。它使用ConfigurationSectionConfigurationElement属性将值映射到类,非常类似于以下答案:A custom config section with nested collections

.NET Core控制台应用程序中包含一个app.config文件,该库能够很好地解析出其中的值并使用它们。是的。

另一方面,NUnit控制台应用程序具有相同的app.config文件,但是该库似乎看不到它。尝试使用ConfigurationManager.GetSection("...")读取值时,它将返回null

有人在这样的环境中得到过app.config文件来与NUnit3一起工作吗?


我尝试过的事情:

它似乎像it supports config files ,但我不确定文档是指某些特殊的NUnit配置文件还是app.config文件。

  • 我尝试将app.config重命名为my_test_project_name.dll.config
  • 我将配置文件“复制到输出目录”设置为“始终复制”
  • 我尝试了所有可能想到的类似名称(app.config,App.config,my_test_project_name.config,my_test_project_name.dll.config等)

在到目前为止编写的一个测试中,我还尝试了一些尝试,尝试以某种方式设置配置文件,例如,建议使用AppDomain.CurrentDomain.SetData()(此方法无效,可能是因为NUnit3不能使用'不支持AppDomain):

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"C:\Path\To\My\Tests\my_test_project_name.dll.config");

尽管NUnit存储库中有一些测试似乎建议using a configuration file in NUnit3 is possible,但该特定测试文件仅在.NET 4.5 demo project中引用,而不在.NET Core demo project中引用。

5 个答案:

答案 0 :(得分:4)

在单元测试中执行以下行并检查其结果时,您可能会注意到NUnit项目正在寻找名为testhost.dll.config的配置文件。

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).FilePath;
  

路径缩短ClassLibrary1\NUnitTestProject1\bin\Debug\netcoreapp2.2\testhost.dll.config

因此,我创建了一个示例,说明如何在ASP.NET Core 2.2和 NUnit Test Project 模板中使用配置文件。此外,请确保将配置文件的复制到输出目录设置设置为Copy always

UnitTest.cs

public class UnitTest
{
    private readonly string _configValue = ConfigurationManager.AppSettings["test"];

    [Test]
    public void Test()
    {
        Assert.AreEqual("testValue", _configValue);
    }
}

testhost.dll.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="test" value="testValue" />
  </appSettings>
</configuration>

答案 1 :(得分:1)

Rider 版本 > 2020.2 及更高版本查找 form-group。因此,要扩展 Nathan Smith 的答案,请使用 ReSharperTestRunner64.dll.config 并复制它:

App.config

答案 2 :(得分:0)

对于一个项目testhost.dll.config运行良好。
对于另一个项目,我不得不使用testhost.x86.dll.config

(prd)中的解决方案对于验证所使用的真实路径非常有帮助

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).FilePath;

https://github.com/dotnet/corefx/issues/22101

使用正确的名称复制app.config

<Target Name="CopyCustomContent" AfterTargets="AfterBuild">
  <Copy SourceFiles="app.config" DestinationFiles="$(OutDir)\testhost.dll.config" />
</Target>
<Target Name="CopyCustomContent" AfterTargets="AfterBuild">
    <Copy SourceFiles="App.config" DestinationFiles="$(OutDir)\testhost.x86.dll.config" />
</Target>

这是另一个有趣的解决方案

<None Update="App.config">
  <Link>testhost.x86.dll.config</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>

答案 3 :(得分:0)

我之所以选择这篇文章,是因为由于app.config错误,在Net.Core测试项目中从Resharper运行NUnit测试时出现了问题。

设置Resharper>选项>单元测试>常规>向Trace记录日志条目的严重性不会提供太多有用的信息。 我安装了Microsoft.NET.Test.Sdk和NUnit3TestAdapter来从VS Test Explorer运行测试,它告诉我配置文件中到底是什么错误。

app.config文件的内容会自动添加到输出目录 if 中的yourTestProjectName.dll.config:

  • 该文件名为app.config

  • 或csproj中有一个标记

  • ,或者指向配置文件的链接,例如:

    从不

如果属性或csproj较新,则无需设置要复制的配置文件的输出。

如果config.file的内容存在问题,则测试最终将因该错误而没有结果:

ReSharper Ultimate – System.NullReferenceException: Object reference not set to an instance of an object.
   at NUnit.Engine.Internal.ServerBase.Start()

答案 4 :(得分:-1)

当我在import requests from bs4 import BeautifulSoup as bs r = requests.get('https://www.snopes.com/fact-check/michael-novenche/') soup = bs(r.content, 'lxml') data = soup.select_one('p:has(>[href="http://web.archive.org/web/20040330161553/http://newyork.local.ie/content/31666.shtml/albany/news/newsletters/general"])').encode_contents().split(soup.select_one('[href="http://web.archive.org/web/20040330161553/http://newyork.local.ie/content/31666.shtml/albany/news/newsletters/general"]').encode_contents()) items = [bs(i, 'lxml').select_one('p').text for i in data] print(items) 测试项目中拥有App.config文件时,我遇到了同样的问题,我将NUnit重命名为App.config,然后开始读取配置文件值。