Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using an app.config file with NUnit3 in a .NET Core console app

The Environment:

I've got three projects in my solution currently:

  • A .NET Standard 2.0 library with some code I'd like to test.
  • A .NET Core 2.2 console app that references the library to make sure it works.
  • A .NET Core 2.2 console app created by using the "NUnit Test Project" template in VS.

The dependencies in my test project all are all from NuGet:

  • Moq Version="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"

The Problem:

The .NET standard library relies on an app.config file being present in any application that uses it. It uses ConfigurationSection and ConfigurationElement attributes to map the values to a class, very similar to this answer: A custom config section with nested collections

The .NET Core console app has an app.config file in it, and the library is able to parse values out of it just fine and use them. Yay.

The NUnit console app, on the other hand, has the same app.config file in it, but the library can't seem to see it. As soon as it tries to read a value using ConfigurationManager.GetSection("...") it returns null.

Has anyone gotten an app.config file to work with NUnit3 in an environment like this?


What I've Tried:

It seems like it supports config files, but I'm not sure if the docs are referring to some special NUnit config file or an app.config file.

  • I tried renaming app.config to my_test_project_name.dll.config
  • I set the config file "Copy to output directory" setting to "Copy always"
  • I tried every similar name I could think of (app.config, App.config, my_test_project_name.config, my_test_project_name.dll.config, etc)

I also tried a few things inside the one test I've written so far, to attempt to set the config file somehow, such as a suggestion to use AppDomain.CurrentDomain.SetData() (didn't work, possibly because NUnit3 doesn't support AppDomain):

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

Although there are tests in the NUnit repo that seem to suggest using a configuration file in NUnit3 is possible, that particular test file is only referenced in the .NET 4.5 demo project, not the .NET Core demo project.

like image 325
Grant Winney Avatar asked Apr 05 '19 19:04

Grant Winney


Video Answer


1 Answers

When you execute the following line within a unit test and inspect its result, you may notice that the NUnit project looks for a configuration file called testhost.dll.config.

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).FilePath;

Path shortened: ClassLibrary1\NUnitTestProject1\bin\Debug\netcoreapp2.2\testhost.dll.config

Thereby, I have created an example of how to use a configuration file with ASP.NET Core 2.2 and the NUnit Test Project template. Also, make sure that the Copy to Output Directory setting for the configuration file is set to 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>
like image 168
prd Avatar answered Sep 17 '22 12:09

prd