在 .NET Core 控制台应用程序中使用带有 NUnit3 的 app.config 文件

Posted

技术标签:

【中文标题】在 .NET Core 控制台应用程序中使用带有 NUnit3 的 app.config 文件【英文标题】:Using an app.config file with NUnit3 in a .NET Core console app 【发布时间】:2019-08-27 17:49:19 【问题描述】:

环境:

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

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

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

起订量版本="4.10.1" nunit" 版本="3.11.0" NUnit.ConsoleRunner" Version="3.10.0" NUnit3TestAdapter" Version="3.13.0" Microsoft.NET.Test.Sdk" Version="16.0.1"

问题:

.NET 标准库依赖于存在于任何使用它的应用程序中的 app.config 文件。它使用ConfigurationSection 和ConfigurationElement 属性将值映射到一个类,非常类似于这个答案: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 中引用。

【问题讨论】:

NUnit 控制台运行程序不适用于 .NET Core 或 .NET Standard,只能用于基于 .NET Framework 的测试。目前还不清楚为什么你要同时使用 NUnit 控制台和 NUnit 测试适配器。 如果您想测试 .NET Standard 库,那么为什么需要 app.config - 只需通过自己的 IConfiguration 实现提供所需的值(例如模拟)。如果您想测试该 .NET Standard 库是否与控制台应用程序一起正常工作 - 测试您的控制台应用程序 - 端到端测试。据我了解,.NET 标准库不应该知道 app.config 文件。 【参考方案1】:

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

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).FilePath;

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

因此,我创建了一个示例,说明如何将配置文件与 ASP.NET Core 2.2 和 NUnit 测试项目 模板一起使用。另外,确保配置文件的复制到输出目录设置为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>

【讨论】:

【参考方案2】:

对于一个项目,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">
    <!-- Command Line (dotnet test) -->
    <Copy SourceFiles="App.config" DestinationFiles="$(OutDir)\testhost.dll.config" />
    <!-- Visual Studio Test Explorer -->
    <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>

【讨论】:

我不得不使用x86 一个。你救了我的命。【参考方案3】:

Rider 版本 > 2020.2 及更高版本查找 ReSharperTestRunner64.dll.config。因此,为了扩展 Nathan Smith 的答案,有一个 App.config 并复制它:

<Target Name="CopyCustomContent" AfterTargets="AfterBuild">
    <!-- Command Line (dotnet test) -->
    <Copy SourceFiles="App.config" DestinationFiles="$(OutDir)\testhost.dll.config" />
    <!-- Rider -->
    <Copy SourceFiles="App.config" DestinationFiles="$(OutDir)\ReSharperTestRunner64.dll.config"/>
</Target>

【讨论】:

【参考方案4】:

由于 app.config 错误,在 Net.Core 测试项目中从 Resharper 运行 NUnit 测试时出现问题,我点击了这篇文章。

设置 Resharper>选项>单元测试>常规>日志条目严重性到 Trace 并没有提供太多有用的信息。 我安装了 Microsoft.NET.Test.Sdk 和 NUnit3TestAdapter 以从 VS 测试资源管理器运行测试,它准确地告诉我配置文件中的错误是什么。

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

文件名为 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()

【讨论】:

以上是关于在 .NET Core 控制台应用程序中使用带有 NUnit3 的 app.config 文件的主要内容,如果未能解决你的问题,请参考以下文章

.NET Core MVC - 带有前缀绑定的 AJAX POST 请求

NET Core 3.1 工作人员服务在 IIS 中

带有 Visual Studio Update 3 的 .Net Core 1.0.0 中的控制器脚手架在哪里

对象反序列化在 Asp Net Core MVC 控制器中的 POST 失败

ASP.Net Core 在运行时注册控制器

带有 SignalR 集线器的 ASP.NET Core 中的范围服务