web-dev-qa-db-fra.com

Utilisation d'un fichier app.config avec NUnit3 dans une application de console .NET Core

L'environnement:

J'ai actuellement trois projets dans ma solution:

  • Une bibliothèque .NET Standard 2.0 avec du code que j'aimerais tester.
  • Une application console .NET Core 2.2 qui référence la bibliothèque pour s'assurer qu'elle fonctionne.
  • Une application console .NET Core 2.2 créée à l'aide du modèle "NUnit Test Project" dans VS.

Les dépendances dans mon projet de test sont toutes de NuGet:

  • Version Moq = "4.10.1"
  • nunit "Version =" 3.11.0 "
  • NUnit.ConsoleRunner "Version =" 3.10.0 "
  • NUnit3TestAdapter "Version =" 3.13.0 "
  • Microsoft.NET.Test.Sdk "Version =" 16.0.1 "

Le problème:

La bibliothèque standard .NET repose sur la présence d'un fichier app.config dans toute application qui l'utilise. Il utilise ConfigurationSection et ConfigurationElement attributs pour mapper les valeurs à une classe, très similaire à cette réponse: ne section de configuration personnalisée avec des collections imbriquées

L'application de console .NET Core contient un fichier app.config, et la bibliothèque est capable d'analyser très bien les valeurs et de les utiliser. Yay.

En revanche, l'application console NUnit contient le même fichier app.config, mais la bibliothèque ne semble pas le voir. Dès qu'il essaie de lire une valeur en utilisant ConfigurationManager.GetSection("...") il retourne null.

Quelqu'un a-t-il obtenu un fichier app.config pour fonctionner avec NUnit3 dans un environnement comme celui-ci?


Ce que j'ai essayé:

Il semble comme il prend en charge les fichiers de configuration , mais je ne sais pas si les documents font référence à un fichier de configuration NUnit spécial ou à un fichier app.config.

  • J'ai essayé de renommer app.config en my_test_project_name.dll.config
  • J'ai défini le fichier de configuration "Copier dans le répertoire de sortie" sur "Copier toujours"
  • J'ai essayé tous les noms similaires auxquels je pouvais penser (app.config, App.config, my_test_project_name.config, my_test_project_name.dll.config, etc)

J'ai également essayé quelques choses dans le test que j'ai écrit jusqu'à présent, pour tenter de définir le fichier de configuration d'une manière ou d'une autre, comme une suggestion d'utiliser AppDomain.CurrentDomain.SetData() (n'a pas fonctionné, peut-être parce que NUnit3 ne fonctionne pas) t supporte AppDomain):

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

Bien qu'il existe des tests dans le référentiel NUnit qui semblent suggérer l'utilisation d'un fichier de configuration dans NUnit3 est possible , ce fichier de test particulier n'est référencé que dans le projet de démonstration .NET 4.5 , pas le . NET Core demo project .

14
vivat pisces

Lorsque vous exécutez la ligne suivante dans un test unitaire et inspectez son résultat, vous pouvez remarquer que le projet NUnit recherche un fichier de configuration appelé testhost.dll.config.

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).FilePath;

Chemin raccourci: ClassLibrary1\NUnitTestProject1\bin\Debug\netcoreapp2.2\testhost.dll.config

Ainsi, j'ai créé un exemple d'utilisation d'un fichier de configuration avec ASP.NET Core 2.2 et le modèle NUnit Test Project. Assurez-vous également que le paramètre Copier dans le répertoire de sortie du fichier de configuration est défini sur 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>
13
prd

Pour un projet testhost.dll.config fonctionne bien.
Pour un autre projet, j'ai dû utiliser testhost.x86.dll.config

La solution de (prd) a été très utile pour vérifier le chemin réel utilisé

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).FilePath;

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

Copiez app.config avec le nom correct

<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>

Ce fut une autre solution intéressante

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